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



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



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



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



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



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

718   11  

11 ответов:

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

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)

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

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

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

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

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

  1. выберите контроллер вида, выберите uibutton
  2. перейдите в Панель утилиты (Command + Option + 0) и выберите инспектор атрибутов(Command + Option + 4)
  3. Теперь выберите контент in края и set вставка по вашему требование.(видеть скриншот)

enter image description here

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

OSLabel.h

#import <UIKit/UIKit.h>

@interface OSLabel : UILabel

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSLabel.м

#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

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

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

вот подпространство UILabel, которое имеет настраиваемое заполнение с использованием свойства edgeInset:

PaddedLabel.h

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

PaddedLabel.м

#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

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

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

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

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

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

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

On Xcode 9, вставок в настоящее время находится в Размер Инспектор вместо инспектора атрибутов:

Xcode 9 Size Inspector - Button insets

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

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

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

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

Comments

    Ничего не найдено.