如何以编程方式设置UIButton的垂直对齐方式 - iOS

时间:2011-12-14 11:46:21

标签: ios cocoa-touch uibutton

我知道如何用IB设置按钮的垂直对齐方式;见here。但我不能以编程方式做到这一点......这是我尝试过的事情之一:

UIButton *button  = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 110, 130)];
[button setTitle:@"Align" forState:UIControlStateNormal];
button.backgroundColor = [UIColor whiteColor];
button.titleLabel.textColor = [UIColor grayColor];
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];

[self.view addSubview:button];

[button release];

我也尝试过插页......

但是对齐不会改变。

请注意,我想保留按钮的CustomStyle(我不想要默认的外观)。

6 个答案:

答案 0 :(得分:20)

您可以通过以下方式对齐(水平和垂直)按钮文本:

        UIButton *button  = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 70)];
        button.backgroundColor = [UIColor whiteColor];
        button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        button.contentVerticalAlignment = UIControlContentVerticalAlignmentBottom;
        [button setTitle:@"Align" forState:UIControlStateNormal];
        [self.container addSubview:button];

答案 1 :(得分:9)

contentVerticalAlignment是要走的路。可能是你创建按钮的方式。试试这个:

 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 button.frame = CGRectMake(10, 10, 110, 130);
 // rest of your code
 // don't release button explicitly

答案 2 :(得分:1)

问题在于使用

button.titleLabel.textColor = [UIColor grayColor];

而不是

[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

在我的代码的其他地方,我仍然在垂直对齐文本时遇到麻烦,但我已经有了基本的例子,所以如果我更多地看一下,我应该能够获得更复杂的版本。也许我正在使用其他方法,如button.titleLabel.textColor,这使得垂直对齐不起作用......

<强>更新 最初的问题实际上是因为我的按钮太短(按钮高度)。

The word `husband' is in the button

单词husband位于按钮中,当前垂直对齐底部。但由于按钮的高度不够,所以并不明显。尽管标题插入内容和内容插入的默认值为零,但标题似乎不能与底部齐平。它看起来像我约5个像素。我用较小的字体测试,以确保这是正确的。

不幸的是,将文本垂直对齐到顶部似乎没有任何改变......

答案 3 :(得分:1)

您可以轻松操作UIButton的内部文本标签。 在这里你可以这样做:

  1. 将按钮的文本设置为@“”(空字符串)
  2. 创建新的UILabel并调整它的框架
  3. 在按钮的视图中插入创建的UILabel作为子视图
  4. 已经完成了。现在您可以以编程方式设置内部位置 UILabel改变了它的框架属性。

答案 4 :(得分:0)

我找到了一种适合我的更好方法。我正在使用自定义字体,所以对齐方式稍微偏离了上面的lindon fox's回答。

你内部的UIButton子类:

- (void)layoutSubviews {

      [super layoutSubviews];

      if (UIEdgeInsetsEqualToEdgeInsets(UIEdgeInsetsZero, self.titleEdgeInsets)) {

            // adjust top, left bottom, and right to fit your needs
            self.titleEdgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
      }
}

我同意使用contentVerticalAlignment设置为UIControlContentVerticalAlignmentCenter的其他答案也是一个好主意。

答案 5 :(得分:0)

我尝试了上面描述的UIEdgeInset更改,但是它们最终破坏了我的视图的LayoutConstraints。因此,我想出了另一种解决方案,它是将UIButton子类化,并在其底部添加了UILabel并对其附加了约束。如果有人想走这条路,这是我的解决方案:

class VerticalButton: UIButton {

lazy var verticalTitleLabel: UILabel = {
    let label = UILabel().autolayout()
    label.font = ScaledFont.shared.font(forTextStyle: .body)
    label.numberOfLines = 0
    label.textColor = .white
    return label
}()

required init?(coder: NSCoder) {
    super.init(coder: coder)
    commonInit()
}

override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}

convenience init(title: String) {
    self.init(frame: .zero)
    verticalTitleLabel.text = title
}

private func commonInit() {
    setTitle(nil, for: .normal)  // Set the original title to nil so it doesn't show
    addSubview(verticalTitleLabel)
    NSLayoutConstraint.activate([
        verticalTitleLabel.bottomAnchor.constraint(equalTo: bottomAnchor),
        verticalTitleLabel.centerXAnchor.constraint(equalTo: centerXAnchor),
        verticalTitleLabel.heightAnchor.constraint(greaterThanOrEqualToConstant: 25.0)
    ])
}

override func setTitle(_ title: String?, for state: UIControl.State) {
    super.setTitle("", for: state)
    verticalTitleLabel.text = title
}
}