I have made extension for UIButton class. Now if I use it everything works good. But I have another class that create for me array with UIButton objects and here I have some problem.
I have Helper class with method that return for me array with UIButton objects.
In ViewController.m in viewDidLoad callback I request for this array and also here in ViewController.m I import my UIButton+Extension.m
So, now I have extension for each UIButton object that I will use in ViewController.m
But if I use extension I have got error on method that call
[thumbButton.titleLabel setFont:[UIFont fontWithName:@"Helvetica" size:11.0]];
but if I don’t use extension this method invoke correct.
this is my UIButton+Extension.h file
#import <UIKit/UIKit.h>
@interface UIButton (extension_button)
- (void)centerButtonToView:(UIView *)view;
- (UIImage *)cropeImage:(UIImageView *)imageView;
@end
this is my UIButton+Extension.m file
#import "UIButton+Extension.h"
@implementation UIButton (extension_button)
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (void)centerButtonToView:(UIView *)view {
CGRect rect = view.frame;
CGRect rectSelf = self.frame;
rectSelf.origin.x = (rect.size.width / 2.0f - rectSelf.size.width / 2.0f) + rect.origin.x;
rectSelf.origin.y = (rect.size.height / 2.0f - rectSelf.size.height / 2.0f) + rect.origin.y;
self.frame = rectSelf;
}
- (UIImage *)cropeImage:(UIImageView *)imageView {
CGRect rect;
rect.origin.x = self.frame.origin.x - imageView.frame.origin.x;
rect.origin.y = self.frame.origin.y - imageView.frame.origin.y;
rect.size.width = self.frame.size.width;
rect.size.height = self.frame.size.height;
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect drawRect = CGRectMake(-rect.origin.x,-rect.origin.y, imageView.image.size.width, imageView.image.size.height);
CGContextClipToRect(context, CGRectMake(0, 0, rect.size.width, rect.size.height));
[imageView.image drawInRect:drawRect];
UIImage* subImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return subImage;
}
@end
Helper.m (method that return array for me and here I have problem on setFont method)
+ (NSMutableArray *)createThumbnailsForCropSize {
CGFloat width = 0.0f;
CGFloat start_pos = 0.0f;
if (IS_IPHONE) {
width = 320.0f;
start_pos = 62.0f;
}
else {
width = 768.0f;
start_pos = 286.0f;
}
NSMutableArray *arr = [[NSMutableArray alloc] init];
NSArray *resolutionArray = [NSArray arrayWithObjects:@"30x40",@"33x48",@"35x40",@"35x45",@"36x47",@"37x47",
@"40x50",@"40x60",@"43x55",@"45x50",@"50x50",@"50x70", nil];
NSInteger pos_x = start_pos;
NSInteger page = 0;
for (NSInteger idx = 0; idx < 12; idx++) {
if (idx%3 == 0 && idx != 0) {
page++;
pos_x = start_pos + width * page;
}
UIButton *thumbButton = [[UIButton alloc] init];
[thumbButton setTag:idx];
[thumbButton setFrame:CGRectMake(pos_x, 13, 60, 60)];
[thumbButton setTitle:[NSString stringWithFormat:[resolutionArray objectAtIndex:idx]] forState:UIControlStateNormal];
[thumbButton.titleLabel setFont:[UIFont fontWithName:@"Helvetica" size:11.0]];
[thumbButton setTitle:@"!00" forState:UIControlStateNormal];
[thumbButton setBackgroundImage:[UIImage imageNamed:@"block_without_photo.png"] forState:UIControlStateNormal];
[arr addObject:thumbButton];
pos_x += 68;
}
return arr;
}
You need to remove
initWithFrame:from your category. By including it, you are removing the normal implementation, and this will be preventing your buttons from being created properly, you will in fact be returning aUIControl.Calling the
superimplementation in a category does not callUIButton‘s implementation, but the superclass ofUIButton–UIControl. Categories are different to subclasses. (And you shouldn’t subclassUIButtoneither, as it is a class cluster).If you do have specialist initialisation code in there, you will have to add it to a separate method and call it during your creation loop.