2015-05-24 29 views
0

我有一个应用程序,我正在更新为自动布局和大小类,并且在按钮上出现一些带有标签的奇怪行为。UIButton上的标签与自动布局排列不正确

该按钮应该是一个圆形,并在中心有一个标签。我正在实现我自己的子类,所以我可以重用它。

这里的故事板:

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

的titleInsets都为0。

帮助极大地赞赏。

回答

0

好吧,这是一个真正的学校的男孩错误。

当文档说'这个方法的实现在iOS 6之前是空的'我出于某种原因意味着没有必要在layoutSubviews上调用super。

所以修正为:

-(void) layoutSubviews { 
    [super layoutSubviews]; // <<<<< THIS WAS MISSING 
    self.layer.cornerRadius = self.frame.size.width/2; 
    self.layer.masksToBounds = YES; 
} 
0

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

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

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

你是否也在程序的某个地方以编程方式更改视图的框架?揭示的那些奇怪的约束指出了这一点。

+0

感谢您的指针。 go标签不是标签,它是按钮的标题([self.titleLabel sizeToFit];等等)。我会仔细检查我没有其他代码覆盖它。 – Lewis42

+0

此外,角布局代码在布局子视图中的原因是,在此之前按钮尚未布置,因此它不会形成圆圈。如果你可以建议这个非hacky的地方说它会很好。我会做其他检查 – Lewis42

+0

没有额外的代码影响布局。该按钮扩展了UIButton。视图控制器没有影响布局的代码,也不是父代。唯一改变的是整个视图的背景颜色,并添加一个按钮导航栏发生在viewDidLoad – Lewis42

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

+0

感谢您的这个@yuyutsu。这种方法的主要缺点是Go!标签不是按钮的一部分,这意味着当按钮被按下时它不会改变状态,因此不像真正的按钮那样感觉到。 这就是说,如果我不能按预期方式正常按钮工作,它可能是我唯一的选择。 – Lewis42