Подтвердить что ты не робот

Как достичь UIButton/UILabel "padding" в приложении iPhone

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

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

Я устал использовать границы и т.д. без каких-либо успехов.

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

ObjC

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

Swift

button.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 30.0, bottom: 0.0, right: 30.0)

Ответ 3

Здесь Дэйв объясняет, как добавить дополнение к названию UIButton, надеюсь, что это поможет. Он использует свойство titleEdgeInsets в UIButton.

Ответ 4

Чтобы установить дополнение в тексте uibutton, вам нужно использовать свойство UIButton contentEdgeInsets. В Storyboard для установки вставки содержимого выполните следующие шаги: -

  • Выберите "Просмотр контроллера", выберите "uibutton"
  • Перейдите в панель "Утилиты" (Command + Option + 0) и выберите "Attributes Inspector" (Command + Option + 4)
  • Теперь выберите Контент в Edge и установите Вставить в соответствии с вашим (см. скриншот)

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

Ответ 5

Чтобы добавить дополнение к 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

Ответ 6

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

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

Ответ 7

Здесь находится подслой 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

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

Ответ 8

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

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

- (CGRect)textRectForBounds:(CGRect)bounds
     limitedToNumberOfLines:(NSInteger)numberOfLines 

Ответ 9

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

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