Как добиться «заполнения» UIButton / UILabel в приложении для iPhone - PullRequest
58 голосов
/ 16 июня 2010

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

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

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

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

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

Ответы [ 10 ]

95 голосов
/ 09 мая 2014

Я использую автоматическое расположение . Решение, которое работало для меня, было установкой UIButton s 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)
22 голосов
/ 16 июня 2010

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

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

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

14 голосов
/ 31 июля 2015

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

  1. Выберите View controller, выберите uibutton
  2. Перейдите в Панель утилит (Command + Option + 0) и выберите Инспектор атрибутов (Command + Option + 4)
  3. Теперь выберите Содержимое в Край и установите Вставка в соответствии с вашим требование. (см. скриншот)

enter image description here

7 голосов
/ 10 июля 2013

Чтобы добавить заполнение в 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
2 голосов
/ 21 апреля 2018

На Xcode 9 , теперь вставки расположены в Инспекторе размеров вместо Инспектора атрибутов:

Xcode 9 Size Inspector - Button insets

2 голосов
/ 21 февраля 2014

Вот подкласс 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

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

2 голосов
/ 19 июля 2013

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

[self sizeToFit];
CGRect rect = self.frame;
rect = CGRectInset( rect, -6.f, -5.f); // h inset, v inset
self.frame = rect;
0 голосов
/ 19 сентября 2018

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

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

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

- (CGRect)textRectForBounds:(CGRect)bounds 
     limitedToNumberOfLines:(NSInteger)numberOfLines;
0 голосов
/ 01 апреля 2014

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

NSString* padding = @"  "; // 2 spaces
myLabel.text = [NSString stringWithFormat:@"%@%@%@", padding, name, padding];
0 голосов
/ 14 июля 2010

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

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

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