如何使用autolayout从代码中创建和添加带有多行标签的UIButton?

时间:2013-11-13 13:50:10

标签: ios objective-c uibutton autolayout

有很多关于如何调整标签大小的链接,但是缺少如何根据标签大小调整UIButton大小的信息。目前,我的屏幕视图设置为autolayout(所有系统约束都是从IB添加的),一切正常,但需要在屏幕底部添加动态内容。我需要创建和添加随机数量的按钮随机长度标题。所以,这是用于创建和添加按钮的代码片段:

// Loop
  UIButton *myButton = [UIButton new];

  UIButton.frame = CGRectMake(0, previousButtonOriginY, self.view.bounds.size.width, 20);
  myButton.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
  myButton.titleLabel.textAlignment = NSTextAlignmentLeft;
  myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
  [myButton setTitle:@"very long title..." forState:UIControlStateNormal];
  myButton.titleLabel.numberOfLines = 0;

  [self.footerView addSubview:myButton];

问题是按钮的框架高度保持20px但标签字符串显示在三行上,因此与另一个按钮标题重叠。如果我添加[myButton sizeToFit],则调整按钮宽度以使所有文本适合一行,因此标题超出了屏幕。

如果我添加[myButton sizeThatFits:CGSizeMake(320,100)],则调整大小根本不起作用。我知道sizeToFit根本不应该被调用,因为它不是自动布局的一部分,但需要建议如何使按钮适合其标签到屏幕320宽度。

我觉得我需要从代码中添加系统约束,但之前没有这样做过,所以不确定它应该是什么样子。我可能需要从代码中添加大量约束才能使这个简单的工作起作用:)

2 个答案:

答案 0 :(得分:0)

您可以使用集合视图,而不是使用集合视图,这样您可以选择更好的选项来布置按钮等元素。

它也能够更好地处理旋转下的布局。

或者您可以使用此代码,它对我有用......

例如,在此处替换所需的填充值:

UIButton * myButton = [[UIButton alloc] init];

// setup some autolayout constraints here
myButton.titleEdgeInsets = UIEdgeInsetsMake(-desiredBottomPadding,
                                            -desiredRightPadding,
                                            -desiredTopPadding,
                                            -desiredLeftPadding);

结合正确的自动布局限制,您最终会得到一个包含图像和文字的自动调整大小按钮!

答案 1 :(得分:0)

对于这种自定义,您需要创建UIButton的子类。在子类中,您可以添加自定义标签,以满足您的需求。您还可以覆盖setTitle:forState方法以自动更新自定义标签。