it-swarm.com.de

So erzielen Sie UIButton/UILabel-Abstände in der iPhone-App

In meiner iPhone-Anwendung gibt es verschiedene Ansichten, die aufgefüllt werden müssen, z. B. ein benutzerdefiniertes UIButton mit nach links ausgerichtetem Text und ein UILabel mit Hintergrundfarbe.

Dies kann eine wirklich blöde Frage sein, aber wie kann ich mit "Padding" den Text vom linken Rand weg bewegen?

Ich habe es satt, Grenzen zu benutzen, ohne Erfolg.

Ich weiß, dass ich eine Wrapper-Ansicht für meine UILabel mit einer Hintergrundfarbe erstellen könnte, aber es scheint mir übertrieben zu sein.

Danke vielmals.

56
user210437

Die einfachste Lösung, die ich bisher gefunden habe, ist:

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

Nicht genau das, was ich wollte, aber es funktioniert.

23
user210437

Ich benutze Auto-Layout . Die Lösung, die für mich funktionierte, war die Einstellung von UIButton scontentEdgeInsets.

ObjC

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

Schnell

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

Um das Auffüllen in Uibutton-Text festzulegen, müssen Sie die contentEdgeInsets-Eigenschaft von UIButton verwenden. In Inhaltsverzeichnis legen Sie die folgenden Schritte fest, um den Inhalt des Inhalts festzulegen: -

  1. Wählen Sie View controller aus, und wählen Sie uibutton 
  2. Gehen Sie zum Dienstprogrammbereich (Befehlstaste + Wahltaste + 0) und wählen Sie den Attribut-Inspektor (Befehlstaste + Wahltaste + 4).
  3. Wählen Sie nun Content in Edge aus und legen Sie Inset entsprechend Ihrer -Anforderung fest (siehe Screenshot).

 enter image description here

12
Giru Bhai

Um UILabel mit Padding zu füllen, ist der flexibelste Ansatz die Unterklasse UILabel und das Hinzufügen einer edgeInsets -Eigenschaft. Sie legen dann die gewünschten Einfügungen fest und das Etikett wird entsprechend gezeichnet.

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
Brody Robertson

Hier ist eine Unterklasse von UILabel, die mithilfe einer edgeInset -Eigenschaft anpassbare Polsterung aufweist:

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

(Dies ist eine Vereinfachung von Brodys Antwort, die auch mit Autolayout funktioniert.)

2
Jakob Egger

CGRectInset ist dein Freund. Sie können negative Einfügungen festlegen, um die Auffüllung zu erstellen:

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

An Xcode 9 befinden sich die Insets jetzt im Size Inspector statt im Attributes Inspector:

 Xcode 9 Size Inspector - Button insets

1
Alex

Wie wäre es mit dem Erstellen einer benutzerdefinierten Klasse, die UIButton erweitert, und diese überschreibt:

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

Im Fall von UILabel überschreiben Sie einfach:

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

Wenn Sie nur nach einer horizontalen Polsterung in einer Linie suchen, kann dies ausreichend sein (es war für mich):

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

Ich versuche, eine ähnliche Sache zu erreichen, nämlich "pad" eine UILabel. Ich habe versucht, die Lösung zu implementieren, die Toby oben veröffentlicht hat, kann aber nicht herausfinden, wohin dies gehen muss .. Das UILabel, mit dem ich arbeite, ist auf der linken Seite ausgerichtet.

Ich habe versucht, dies in viewDidLoad und sogar in einer Unterklasse von UILabel in der Methode zu verwenden:

- (CGRect)textRectForBounds:(CGRect)bounds
     limitedToNumberOfLines:(NSInteger)numberOfLines 
0
Alan Taylor