Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS: UIButton titleLabel -- does it do anything at all?

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?

like image 530
Amagrammer Avatar asked Feb 05 '11 23:02

Amagrammer


People also ask

What is UIButton?

A control that executes your custom code in response to user interactions.

What is button in iOS swift?

It is a control that enables the user to interact with the application. It is used to trigger the events performed by the user. It executes the custom code in response to user interactions. class UIButton : UIControl.

How do I center a button in Swift?

To create constraints select the button and click the Align icon in the auto layout menu. A popover menu will appear, check both “Horizontal in container” and “Vertically in container” options to center the button on the screen.


2 Answers

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.

like image 160
CIFilter Avatar answered Sep 19 '22 19:09

CIFilter


Here's how I worked it out using Swift 4.2.

counterButton.setTitle("Start Counter",
                      for:UIControl.State.normal)
like image 22
raddevus Avatar answered Sep 22 '22 19:09

raddevus