Можно ли настроить положение x, y для titleLabel UIButton?

121

Можно ли отрегулировать положение x, y для titleLabela UIButton?

Вот мой код:

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    [btn setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
    [btn setTitle:[NSString stringWithFormat:@"Button %d", i+1] forState:UIControlStateNormal];     
    [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    btn.titleLabel.frame = ???
RAGOpoR
источник
1
Пожалуйста, выберите другой ответ, чтобы мы могли удалить очень отрицательный. Или объясните, почему вы это сделали.
tchrist
1
Почему этот ответ не принят?
Антонио MG
Это все, что вам нужно stackoverflow.com/questions/18484747/uibutton-titleedgeinsets

Ответы:

445
//make the buttons content appear in the top-left
[button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentTop];

//move text 10 pixels down and right
[button setTitleEdgeInsets:UIEdgeInsetsMake(10.0f, 10.0f, 0.0f, 0.0f)];

И в Swift

//make the buttons content appear in the top-left
button.contentHorizontalAlignment = .Left
button.contentVerticalAlignment = .Top

//move text 10 pixels down and right
button.titleEdgeInsets = UIEdgeInsetsMake(10.0, 10.0, 0.0, 0.0)

Swift 5

button.contentHorizontalAlignment = .left
button.contentVerticalAlignment = .top
button.titleEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 0.0, right: 0.0)
cannyboy
источник
3
это определенно лучший ответ
greenisus
3
Интересно, почему спрашивающий выбрал другой ответ. Этот намного лучше.
Джошуа
4
Мне даже не понадобились первые две строчки ... setTitleEdgeInsets:это все, что я нашел необходимым для перемещения текста.
ArtOfWarfare
Это определенно правильно, но, вероятно, легче выполнить с помощью построителя интерфейса (как описано в моем ответе).
eladleb 01
Первые две строки позиционируют ваш текст на 0,0 (x, y). Это может предотвратить относительное позиционирование; особенно если вы установите выравнивание по умолчанию в xib.
Jarrett Barnett
40

Самый простой способ сделать это визуально - использовать инспектор атрибутов ** (появляется при редактировании xib / раскадровки), установив для свойства « край » значение заголовка, отрегулировав его вставки, затем установив свойство «край» для изображения и соответствующим образом отрегулировав , Обычно это лучше, чем кодировать, поскольку его легче поддерживать и он очень нагляден.

Настройка инспектора атрибутов

eladleb
источник
1
Хороший совет для изменения Edgeдо Titleи затем настроить вставку!
Дин
Для справки в будущем, начиная с Xcode 8, вместо установки edgeсвойства вы можете настраивать вставки заголовка в инспекторе размеров.
dbmrq
14

Унаследовать от UIButton и реализовать следующий метод:

- (CGRect)titleRectForContentRect:(CGRect)contentRect;

Редактировать:

@interface PositionTitleButton : UIButton
@property (nonatomic) CGPoint titleOrigin;
@end

@implementation PositionTextButton
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
  contentRect.origin = titleOrigin;
  return contentRect;
}
@end
drawnonward
источник
Спасибо, это то, что мне действительно нужно. Автоматического центрирования было недостаточно.
dmzza
4

Для моих проектов есть эта утилита расширения:

extension UIButton {

    func moveTitle(horizontal hOffset: CGFloat, vertical vOffset: CGFloat) {
        self.titleEdgeInsets.left += hOffset
        self.titleEdgeInsets.top += vOffset
    }

}
Лука Даванцо
источник