我为我的应用程序创建了一个UIButton子类,我需要手动将titleLabel重新定位为按钮高度的1/4左右。这个帖子; http://forums.macrumors.com/showthread.php?t=763140似乎直接解决了同一问题,解决方案很简单,完全可以理解。但是,我没有实现这个,因为我从未调用过layoutSubviews。我的按钮是静态的,所以layoutSubviews只需要第一次调用,但它永远不会。我的代码:
@interface MyButton : UIButton {}
@implementation MyButton
- (id)initWithFrame:(CGRect)frame
{
self = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
[[self layer] setCornerRadius:14.0f];
[[self layer] setBorderWidth:3.0f];
[[self layer] setMasksToBounds:YES];
[self setBackgroundColor:[UIColor redColor]];
[self setFrame:frame];
return self;
}
- (void)layoutSubviews
{
NSLog(@"layout subs\n");
[super layoutSubviews];
}
@end
移动标签没问题,但是从不调用layoutSubviews。我也尝试过添加layoutIfNeeded,但没有区别。甚至更奇怪的是,我试图直接从构造函数调用[self layoutSubviews],但layoutSubviews 仍未被调用!。我开始认为这可能是SDK 3.1.3中的一个错误
任何人都可以帮忙吗?!
答案 0 :(得分:2)
在layoutSubviews
中,您可以对子视图进行布局更改。确保方法内部:
√致电[super layoutSubviews]
x 此处不要更改rect
的值或self.frame
。如果你这样做,它将以递归方式调用layoutSubviews
。
√请确保只更改子视图的frame
。
答案 1 :(得分:1)
回答我自己的问题,似乎我的分类不正确。采用以下方法会导致layoutSubviews被正确调用:
+ (id)buttonWithFrame:(CGRect)frame {
return [[[self alloc] initWithFrame:frame] autorelease];
}
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame])
{
...
[self setFrame:frame];
}
return self;
}
希望能帮助他人