UIButton上的标签未使用autolayout

时间:2015-05-24 23:00:37

标签: ios8 uibutton autolayout uikit uistoryboard

我有一个应用程序,我正在更新为自动布局和大小类,我在按钮上的标签上有一些奇怪的行为。

按钮应为圆形,中间有标签。我正在实现自己的子类,所以我可以重用它。

这是故事板:

Storyboard

Storyboard 2

以及扩展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];
    }

}

然后会出现标签,但它位于错误的位置:

Screenshot

我能提供的唯一额外信息是,在Reveal中,按钮添加了奇怪的高度和宽度限制:

Reveal

titleInsets全部为0.

非常感谢。

3 个答案:

答案 0 :(得分:0)

我认为您不需要layoutSubviews覆盖。我认为这是一个黑客,它隐藏了你的真正问题。

“Go”标签有哪些限制?你是如何将它集中在UIButton的?还有什么是标签上的高度限制?

我的建议是将UIButton和Go标签放在容器视图中,并将标签置于容器视图中。容器视图应具有与其中的UIButton相同的高度和宽度。

您是否也在应用程序的某处以编程方式更改了视图的框架?你在谈到的那些奇怪的约束揭示了这一点。

答案 1 :(得分:0)

根据您的要求: enter image description here enter image description here enter image description here enter image description here

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

<强>输出

output

答案 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;
}