iOS: UIButton的titleLabel -- 它有任何作用吗?

27

我想要创建一个UIButton,并设置其类型为UIButtonTypeCustom(以适配样式)。我想通过button.titleLabel来设置按钮的标题,因为我需要指定字体。下面的代码看起来应该可以工作,但是它并没有显示任何标签。

UIImage *editButtonImage = [UIImage imageNamed: @"editButton.png"];
float width = editButtonImage.size.width;
float height = editButtonImage.size.height;

UIButton *editButton = [UIButton buttonWithType: UIButtonTypeCustom];
editButton.frame = CGRectMake(0, 0, width, height);
[editButton setBackgroundImage: editButtonImage forState: UIControlStateNormal];
editButton.adjustsImageWhenHighlighted = YES;
editButton.titleLabel.text = @"Edit";
editButton.titleLabel.textColor = [UIColor whiteColor];
editButton.titleLabel.textAlignment = UITextAlignmentCenter;
editButton.titleLabel.font = [UIFont fontWithName: @"Helvetica" size: 14];
[self.view addSubview: editButton];

大家总是说要使用setTitle:forState:,但是那会给你一个我不喜欢的字体。titleLabel方法没有过时--它应该可以工作。

我之前遇到这个问题好几次了,总是绕开它解决,但我真的很想找出解决方法。有什么想法吗?

2个回答

79

像那样设置titleLabeltext属性是没有效果的。相反,应该在按钮上调用-setTitle:forState:

[editButton setTitle:@"Edit" forState:UIControlStateNormal]

这是因为按钮可以有不同的状态(例如UIControlStateDisabled, UIControlStateHighlighted),每个状态下的标题都可以不同。如果您没有明确指定其他状态,那么为UIControlStateNormal设置属性将应用于所有状态。

根据UIButton的文档:

此类提供了一些方法,用于设置按钮的标题、图像和其他外观属性。通过使用这些访问器,您可以为每个按钮状态指定不同的外观。

您可以基于状态自定义标签的颜色和阴影颜色。分别参见-setTitleColor:forState-setTitleShadowColor:forStatetitleLabel上的其余属性,如textAlignmentfont,应按照您现在设置的方式工作,并应用于所有控件状态。

具体而言,请参见UIButtontitleLabel属性的文档:https://developer.apple.com/documentation/uikit/uibutton/1623992-titlelabel

titleLabel本身是只读的,但这并不意味着您不能更改其自身属性的值,例如字体、换行模式等。


1
所以,使用titleLabel无法设置的唯一内容是实际文本值。这对我来说有点奇怪,但没关系。 - Amagrammer
4
起初可能有点违反直觉。看起来,设置标签的 text 属性只是调用 -setTitle:forState 的捷径,但实际上并不是这样。 - CIFilter
2
同样地,看起来您不能直接设置titleLabel的textColor属性,而必须使用setTitleColor:forState:方法。感谢您提到这一点,因为它没有在文档中提到。 - arlomedia
titleLabel.textAlignment 不正确。要对齐文本,您必须使用 titleLabel.contentHorizontalAlignment = .Left - Phil Andrews

1
这是我使用Swift 4.2解决问题的方法。
counterButton.setTitle("Start Counter",
                      for:UIControl.State.normal)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接