我知道如何用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(我不想要默认的外观)。
答案 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,这使得垂直对齐不起作用......
<强>更新强> 最初的问题实际上是因为我的按钮太短(按钮高度)。
单词husband
位于按钮中,当前垂直对齐底部。但由于按钮的高度不够,所以并不明显。尽管标题插入内容和内容插入的默认值为零,但标题似乎不能与底部齐平。它看起来像我约5个像素。我用较小的字体测试,以确保这是正确的。
不幸的是,将文本垂直对齐到顶部似乎没有任何改变......
答案 3 :(得分:1)
您可以轻松操作UIButton的内部文本标签。 在这里你可以这样做:
答案 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
}
}