Как достичь UIButton / UILabel 'padding' в приложении для iPhone
У меня есть различные представления в моем приложении для iPhone, которые требуют заполнения, например, пользовательский UIButton с выравниванием текста слева и UILabel с цветом фона.
это может быть действительно глупый вопрос, но как я могу применить "отступ", чтобы переместить текст с левого края?
Я устал через границы и т. д. без какого-либо успеха.
Я знаю, что могу создать вид обертки для моего UILabel с цветом фона, но похоже перебор.
большое спасибо.
11 ответов:
Я использую автоматический макет. Решение, которое работало для меня было установка
UIButton' scontentEdgeInsets.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собственность. В раскадровке, чтобы установить содержимое вставки выполните следующие действия: -
- выберите контроллер вида, выберите uibutton
- перейдите в Панель утилиты (Command + Option + 0) и выберите инспектор атрибутов(Command + Option + 4)
- Теперь выберите контент in края и set вставка по вашему требование.(видеть скриншот)
для добавления дополнения к UILabel наиболее гибким подходом является подкласс UILabel и добавление свойства edgeInsets. Затем вы устанавливаете нужные вставки, и метка будет нарисована соответствующим образом.
OSLabel.h
#import <UIKit/UIKit.h> @interface OSLabel : UILabel @property (nonatomic, assign) UIEdgeInsets edgeInsets; @endOSLabel.м
#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; @endPaddedLabel.м
#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];
Как насчет создания пользовательского класса, который расширяет UIButton и переопределяет это:
- (CGRect)titleRectForContentRect:(CGRect)contentRect { return UIEdgeInsetsInsetRect(contentRect, UIEdgeInsetsMake(topPadding, rightPadding, bottomPadding, leftPadding)); }в случае UILabel просто переопределить:
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines;


Comments