Как добиться заполнения UIButton / UILabel в приложении для iPhone

У меня есть различные представления в моем приложении для iPhone, которые требуют заполнения, например настраиваемый UIButton с текстом, выровненным по левому краю, и UILabel с цветом фона.

Это может быть действительно глупый вопрос, но как я могу применить «отступ», чтобы сместить текст с левого края?

Я устал безуспешно использовать границы и т. Д.

Я знаю, что могу создать обертку для моего UILabel с цветом фона, но это кажется излишним.

Большое спасибо.


person Community    schedule 16.06.2010    source источник
comment
Марко Армент написал в Твиттере очень простой подкласс UILabel, который добавляет отступы в стиле UIEdgeInsets в рисунок ярлыка: он на gist.github как IPInsetLabel.   -  person cbowns    schedule 25.05.2012


Ответы (10)


Я использую автоматический макет. Решение, которое сработало для меня, - это установка contentEdgeInsets UIButton.

ObjC

button.contentEdgeInsets = UIEdgeInsetsMake(0.0f, 30.0f, 0.0f, 30.0f);

Быстрый

button.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 30.0, bottom: 0.0, right: 30.0)
person Rafa de King    schedule 09.05.2014

Хорошо, самое простое решение, которое я нашел до сих пор:

self.textAlignment = UITextAlignmentCenter; 
[self sizeToFit]; 
CGRect frame = self.frame;
frame.size.width += 20; //l + r padding 
self.frame = frame;

Не совсем то, что я хотел, но работает.

person Community    schedule 16.06.2010
comment
Мне не удалось настроить это решение, чтобы оно работало для выравнивания по левому краю. Это действительно старый ответ, я думаю, он может не работать в iOS 6. Надеюсь, что кто-то сможет предоставить обновление. - person Philip007; 24.12.2012
comment
Отлично работает, но с iOS 6.0 вам нужно использовать NSTextAlignmentCenter, UITextAlignmentCenter устарел. - person chrisdowney; 16.06.2013

Чтобы установить отступ в UIButton тексте, вам нужно использовать свойство UIButton contentEdgeInsets.

В раскадровке, чтобы установить вставку содержимого, выполните следующие действия:

  1. Выберите контроллер представления, затем выберите UIButton
  2. Перейдите на панель утилит (Command + Option + 0) и выберите Attributes Inspector (Command + Option + 4).
  3. Теперь выберите Контент в Edge и установите Inset в соответствии с вашими требованиями (см. Снимок экрана).

введите описание изображения здесь

person Giru Bhai    schedule 31.07.2015
comment
Теперь его в инспекторе размера - person ilan; 16.01.2017
comment
Теперь это кнопка - ›Вставки содержимого в инспекторе размера. - person Siddharth; 21.03.2017
comment
XCode 9 и далее UIButton - ›Инспектор размеров -› Content Insets == ›, как показано на этом изображении: stackoverflow.com/a/49959281 - person Bruno Bieri; 31.07.2019

Чтобы добавить заполнение в UILabel, наиболее гибким подходом является создание подкласса UILabel и добавление свойства edgeInsets. Затем вы устанавливаете желаемые вставки, и метка будет нарисована соответствующим образом.

OSLabel.h

#import <UIKit/UIKit.h>

@interface OSLabel : UILabel

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSLabel.m

#import "OSLabel.h"

@implementation OSLabel

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

- (void)drawTextInRect:(CGRect)rect {
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}

@end
person Brody Robertson    schedule 09.07.2013

В Xcode 9 вставки теперь находятся в инспекторе размеров, а не в инспекторе атрибутов:

Xcode 9 Size Inspector - Вставки кнопок

person Alex    schedule 21.04.2018

Вот подкласс UILabel, у которого есть настраиваемые отступы с помощью свойства edgeInset:

PaddedLabel.h

#import <UIKit/UIKit.h>
@interface PaddedLabel : UILabel
@property UIEdgeInsets edgeInsets;
@end

PaddedLabel.m

#import "PaddedLabel.h"
@implementation PaddedLabel
-(void)drawTextInRect:(CGRect)rect {
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}
-(CGSize)intrinsicContentSize {
    CGSize contentSize = [super intrinsicContentSize];
    UIEdgeInsets insets = self.edgeInsets;
    contentSize.height += insets.top + insets.bottom;
    contentSize.width += insets.left + insets.right;
    return contentSize;
}
@end

(Это упрощение ответа Броуди, который также работает с автоматическим раскладкой.)

person Jakob Egger    schedule 21.02.2014

CGRectInset - ваш друг. Вы можете установить отрицательные 'вставки' ​​для создания отступов:

[self sizeToFit];
CGRect rect = self.frame;
rect = CGRectInset( rect, -6.f, -5.f); // h inset, v inset
self.frame = rect;
person cleverbit    schedule 18.07.2013

Я пытаюсь добиться того же, то есть «проложить» UILabel. Я пытался реализовать решение, которое Тоби опубликовал выше, но, похоже, не могу найти, куда это нужно делать. UILabel, с которым я работаю, выровнен по левому краю - это то, что вызывает проблему?

Я пробовал использовать это в viewDidLoad и даже в подклассе UILabel в методе:

- (CGRect)textRectForBounds:(CGRect)bounds
     limitedToNumberOfLines:(NSInteger)numberOfLines 
person Alan Taylor    schedule 14.07.2010

А как насчет создания настраиваемого класса, расширяющего UIButton, и его переопределения:

- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    return UIEdgeInsetsInsetRect(contentRect, UIEdgeInsetsMake(topPadding, rightPadding, bottomPadding, leftPadding));
}

В случае UILabel просто переопределите:

- (CGRect)textRectForBounds:(CGRect)bounds 
     limitedToNumberOfLines:(NSInteger)numberOfLines;
person PakitoV    schedule 19.09.2018

Если вы просто ищете горизонтальный отступ на одной строке, этого может быть достаточно (это было для меня):

NSString* padding = @"  "; // 2 spaces
myLabel.text = [NSString stringWithFormat:@"%@%@%@", padding, name, padding];
person Lukas Kalinski    schedule 01.04.2014