我有一个应用程序,我正在更新为自动布局和大小类,我在按钮上的标签上有一些奇怪的行为。
按钮应为圆形,中间有标签。我正在实现自己的子类,所以我可以重用它。
这是故事板:
以及扩展UIButton的类的代码:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self setBackgroundImage:[UIImage imageNamed:@"selected-green"] forState:UIControlStateHighlighted ];
self.layer.borderColor = [UIColor tlbWhiteColor].CGColor;
self.layer.borderWidth = 10;
}
return self;
}
-(void) layoutSubviews {
self.layer.cornerRadius = self.frame.size.width / 2;
}
有了这个,出现了预期,但没有标签。在调试时,我看到标签的框架有0高度和宽度。所以我扩展了layoutSubviews:
-(void) layoutSubviews {
self.layer.cornerRadius = self.frame.size.width / 2;
if (self.titleLabel.frame.size.width == 0) {
[self.titleLabel sizeToFit];
[self setNeedsLayout];
[self layoutIfNeeded];
}
}
然后会出现标签,但它位于错误的位置:
我能提供的唯一额外信息是,在Reveal中,按钮添加了奇怪的高度和宽度限制:
titleInsets全部为0.
非常感谢。
答案 0 :(得分:0)
我认为您不需要layoutSubviews覆盖。我认为这是一个黑客,它隐藏了你的真正问题。
“Go”标签有哪些限制?你是如何将它集中在UIButton的?还有什么是标签上的高度限制?
我的建议是将UIButton和Go标签放在容器视图中,并将标签置于容器视图中。容器视图应具有与其中的UIButton相同的高度和宽度。
您是否也在应用程序的某处以编程方式更改了视图的框架?你在谈到的那些奇怪的约束揭示了这一点。
答案 1 :(得分:0)
根据您的要求:
- (void)viewDidLoad {
[super viewDidLoad];
view_1.layer.cornerRadius = 10; //view_1 is white color
view_1.layer.masksToBounds = YES;
view_2.layer.cornerRadius = _view_2.frame.size.width/2;//view_2 is green color
view_2.layer.masksToBounds = YES;
}
<强>输出强>
答案 2 :(得分:0)
好的,这是一个真正的男生错误。
当文档说&#39;这个方法的实现在iOS 6之前是空的&#39;我出于某种原因认为这意味着没有必要在layoutSubviews
上打电话给超级。
所以解决方法是:
-(void) layoutSubviews {
[super layoutSubviews]; // <<<<< THIS WAS MISSING
self.layer.cornerRadius = self.frame.size.width / 2;
self.layer.masksToBounds = YES;
}