web-dev-qa-db-ja.com

iPhoneアプリでUIButton / UILabelの「パディング」を実現する方法

IPhoneアプリケーションには、パディングを必要とするさまざまなビューがあります。たとえば、テキストを左揃えにしたカスタムUIButtonや、背景色を使用したUILabelです。

これは本当にばかげた質問かもしれませんが、「パディング」を適用してテキストを左端から移動するにはどうすればよいですか?

私は成功せずに境界などを使用して疲れています。

背景色でUILabelのラッパービューを作成できることは知っていますが、やり過ぎのようです。

どうもありがとう。

58
user210437

OKこれまで見つけた最も簡単な解決策は次のとおりです。

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

まさに私が望んでいたものではありませんが、うまくいきます。

22
user210437

自動レイアウトを使用しています。私のために働いた解決策は、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)
97
RaffAl

UIButtonテキストにパディングを設定するには、UIButtoncontentEdgeInsetsプロパティを使用する必要があります。

ストーリーボードで、コンテンツのインセットを設定するには、次の手順を実行します。

  1. View Controllerを選択し、UIButtonを選択します
  2. [ユーティリティ]パネル([Command] + [Option] + [0])に移動し、[属性インスペクター]([Command] + [Option] + [4])を選択します
  3. 次に、EdgeContentを選択し、Inset要件に応じて(スクリーンショットを参照)

enter image description here

15
Giru Bhai

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

Xcode 9では、インセットは代わりにSize Inspectorに配置されます属性インスペクターの:

Xcode 9 Size Inspector - Button insets

3
Alex

以下は、edgeInsetプロパティを使用してカスタマイズ可能なパディングを持つUILabelのサブラスです。

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

(これは、自動レイアウトでも機能するBrodyの答えを単純化したものです。)

2
Jakob Egger

CGRectInsetはあなたの友達です。負の「インセット」を設定してパディングを作成できます。

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

UIButtonを拡張し、これをオーバーライドするカスタムクラスを作成するとどうなりますか。

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

UILabelの場合は、単にオーバーライドします。

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

1行の水平方向のパディングを探しているだけなら、これで十分かもしれません(私にとってはそうでした):

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

私は同様のことを達成しようとしています。それはUILabelを「パッド」します。私はトビーが上に投稿したソリューションを実装しようとしましたが、これがどこに行く必要があるのか​​見つけることができないようです。私が作業しているUILabelは左揃えになっています-それが問題の原因ですか?

私はviewDidLoadでこれを使用してみましたが、メソッドのUILabelのサブクラスでも使用しました:

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