2012-07-25 52 views
1

我已经对UIButton类进行了扩展。现在,如果我使用它,一切都很好。但我有另一个类为我创建与UIButton对象数组,我在这里有一些问题。UIButton类别问题

我有辅助类与方法,返回给我数组与UIButton对象。

在ViewController.m的viewDidLoad中的回调我ViewController.m请求该阵列和这里我输入我的UIButton + Extension.m

所以,现在我已经扩展为每个对象的UIButton,我会在ViewController.m

使用,但如果我使用延长我有上调用

[thumbButton.titleLabel setFont:[UIFont fontWithName:@"Helvetica" size:11.0]]; 

方法错误,但如果我不使用扩展这个方法调用正确的。

这是我的UIButton + Extension.h文件

#import <UIKit/UIKit.h> 

@interface UIButton (extension_button) 

- (void)centerButtonToView:(UIView *)view; 
- (UIImage *)cropeImage:(UIImageView *)imageView; 

@end 

这是我的UIButton + Extension.m文件

#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(方法为我返回数组,在这里我有问题在setFont方法)

+ (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; 
} 

回答

2

您需要从您的类别中删除initWithFrame:。通过包含它,您将删除正常实现,并且这将阻止您的按钮被正确创建,实际上您将返回UIControl

调用在一个类别super实现不呼叫UIButton的实现,但UIButton超 - UIControl。类别与子类不同。 (你也不应该将UIButton也归类,因为它是一个类集群)。

如果您确实有专家初始化代码,您必须将其添加到单独的方法并在创建循环中调用它。

+0

是的,谢谢我做到了 – 2012-07-25 10:13:08

+0

'UIButton'不是类集群。它的类方法'buttonWithType:'可能不会返回你的子类的一个实例,但'init'系列中的方法会。 – 2014-09-25 17:14:59