【问题标题】:Background image not displayed on UIViewUIView 上不显示背景图片
【发布时间】:2011-07-23 09:46:52
【问题描述】:

我有一个实现“UIView”的类,在- (void)drawRect:(CGRect)rect 方法中,我为self 添加了一些自定义按钮。在 UIViewController 中,我声明了该视图的一个实例并将其添加到 self.view。

如果我在- (void)viewDidLoad 中执行此操作,一切正常,但如果我创建一个在我按下按钮时调用的方法,并将该视图添加到 self.view,按钮背景会在几秒钟后显示。到那时,只有按钮的名称以白色显示。

我做错了什么? 问候

@implementation CustomButton

@synthesize isPressed, buttonViewNumber;

- (id)initWithFrame:(CGRect)frame 
          title:(NSString *)title 
            tag:(int)tag
{
self = [super initWithFrame:frame];
if (self) {
    [self setTitle:title forState:UIControlStateNormal];
    [self setTag:tag];
    self.titleLabel.font = [UIFont fontWithName:@"Helvetica" size:14];
    self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
    self.contentEdgeInsets = UIEdgeInsetsMake(0, 5, 0, 0);


    [self setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
    [self setBackgroundImage:[[UIImage imageNamed:@"btn_white_add.png"]                                                     stretchableImageWithLeftCapWidth:20.0 topCapHeight:0.0] forState:UIControlStateNormal];

    [self addTarget:self action:@selector(didSelect)          forControlEvents:UIControlEventTouchUpInside];
    self.isPressed = NO;

}
return self;
}

@implementation ButtonsView

@synthesize listOfButtons;

- (id)initWithFrame:(CGRect)frame bundle:(NSArray *)data
{
self = [super initWithFrame:frame];
if (self) {
    self.backgroundColor = [UIColor clearColor];
    listOfNames = [[NSArray arrayWithArray:data] retain];
    listOfButtons = [[NSMutableArray alloc] init];
    currentViewNumber = 0;
    viewNumber = 0;
}
return self;
}


- (void)drawRect:(CGRect)rect
{
CGSize maximumLabelSize = CGSizeMake(300,24);
UIFont *buttonFont = [UIFont fontWithName:@"Helvetica" size:14.0];

float lineSize = 0;
float lineNumber = 0;

NSArray *listOfFrameX = [NSArray arrayWithObjects: 
                         [NSString stringWithFormat:@"%d",FIRST_LINE_Y],
                         [NSString stringWithFormat:@"%d",SECOND_LINE_Y],
                         [NSString stringWithFormat:@"%d",THIRD_LINE_Y],
                         nil];

for (int i = 0; i < [listOfNames count]; i++) {
    CGSize expectedLabelSize = [[[listOfNames objectAtIndex:i] objectForKey:@"name"]  sizeWithFont:buttonFont 
                                                                                  constrainedToSize:maximumLabelSize 
                                                                                     lineBreakMode:UILineBreakModeTailTruncation];
    if ((lineSize + expectedLabelSize.width) > 260) {
        lineNumber++;
        lineSize = 0;
    }
    if (lineNumber > 2) {
        viewNumber ++;
        lineSize = 0;
        lineNumber = 0;
    }

    CGRect newFrame = CGRectMake(lineSize, 
                                  [[listOfFrameX objectAtIndex:lineNumber] floatValue], 
                                  expectedLabelSize.width+30, 
                                  24);

    CustomButton *myButton = [[CustomButton alloc] initWithFrame:newFrame 
                                                         title:[[listOfNames  objectAtIndex:i] objectForKey:@"name"] 
                                                           tag:[[[listOfNames objectAtIndex:i] objectForKey:@"id"] intValue]];

    myButton.buttonViewNumber = viewNumber;

    [listOfButtons addObject:myButton];
    if (viewNumber == 0) {
        [self addSubview:myButton];
    }

    lineSize += expectedLabelSize.width + 40;

    [myButton release];
    }
}

这样就可以了:

- (void)viewDidLoad
{
[super viewDidLoad];

placeholders = [[NSArray arrayWithObjects:
                something,something, something,something,nil] retain];

CGRect frame = CGRectMake(10, 247, 300, 84);
buttonsView = [[ButtonsView alloc] initWithFrame:frame bundle:placeholders];
[self.view addSubview:buttonsView];

这样是行不通的:

- (void)getCompanyNames:(id)result
{
NSArray *listOfCompanies = (NSArray *)result;

CGRect frame = CGRectMake(10, 247, 300, 84);
buttonsView = [[ButtonsView alloc] initWithFrame:frame bundle:listOfCompanies];

[self.view addSubview:buttonsView];

}

我需要在 -viewDidLoad 之后将“buttonsView”对象添加到 self.view

【问题讨论】:

  • 你没有实现一个类(UIView),你子类一个类,或者有时你会看到它被引用到扩展一个类(但还有其他方法可以扩展它,所以最好不要使用该术语)

标签: iphone ios


【解决方案1】:

drawRect: 并不是您应该为您的视图创建子视图(按钮是子视图)的地方。这应该进入 initWithFrame:awakeFromNib,具体取决于您的视图创建方法:以编程方式或使用 nib。

【讨论】:

  • 如果我以实用的方式创建按钮,我应该使用 initWithFrame?