问题
I want to make a UIButton with type UIButtonTypeCustom (for the shape). I want to assign the title using button.titleLabel because I need to specify the font. The following code looks like it should work, but doesn't -- no label shows up, period.
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];
Everyone always says to use setTitle:forState: but that gives you a font I don't like. The titleLabel method is NOT deprecated -- it should work.
I have run into this several times before and always just worked around it, but I'd really like to figure it out. Any ideas?
回答1:
Setting the titleLabel
's text
property like that has no effect. Instead, call -setTitle:forState:
on the button:
[editButton setTitle:@"Edit" forState:UIControlStateNormal]
The reason for this is because the button can have different titles for different states (e.g., UIControlStateDisabled
, UIControlStateHighlighted
). Setting a property for the UIControlStateNormal
control state will apply to all the states if you don't specify the others explicitly.
Per the documentation for UIButton
:
This class provides methods for setting the title, image, and other appearance properties of a button. By using these accessors, you can specify a different appearance for each button state.
You can customize label's color and shadow color based on the state. See -setTitleColor:forState
and -setTitleShadowColor:forState
, respectively. The rest of the properties on titleLabel
, such as textAlignment
and font
, should work as you have them set now and should apply to all the control states.
Specifically, see the documentation for UIButton
's titleLabel
property: https://developer.apple.com/documentation/uikit/uibutton/1623992-titlelabel
titleLabel
itself is read-only, but that doesn't mean you can't change the values of its own properties, such as font, line break mode, etc.
回答2:
Here's how I worked it out using Swift 4.2.
counterButton.setTitle("Start Counter",
for:UIControl.State.normal)
来源:https://stackoverflow.com/questions/4910446/ios-uibutton-titlelabel-does-it-do-anything-at-all