web-dev-qa-db-ja.com

UITextFieldに左マージンを追加します

UITextFieldのテキストの左余白を10ピクセルに設定します。それを行う最良の方法は何ですか?

24
iOSPawan

前のコメントで説明したように、この場合の最善の解決策は、カテゴリを使用する代わりにUITextFieldクラスを拡張することです。これにより、目的のテキストフィールドで明示的に使用できます。

#import <UIKit/UIKit.h>

@interface MYTextField : UITextField

@end


@implementation MYTextField

- (CGRect)textRectForBounds:(CGRect)bounds {
    int margin = 10;
    CGRect inset = CGRectMake(bounds.Origin.x + margin, bounds.Origin.y, bounds.size.width - margin, bounds.size.height);
    return inset;
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    int margin = 10;
    CGRect inset = CGRectMake(bounds.Origin.x + margin, bounds.Origin.y, bounds.size.width - margin, bounds.size.height);
    return inset;
}

@end

カテゴリは、既存のメソッドをオーバーライドするのではなく、既存のクラスに新しい関数を追加することを目的としています。

20
clopez

これを行うには、UITextFieldクラスを拡張し、2つのメソッドをオーバーライドします。

- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;

これがコードです:

MYTextField.hのインターフェース

@interface MYTextField : UITextField

@end

MYTextField.mでの実装

@implementation MYTextField

static CGFloat leftMargin = 28;

 - (CGRect)textRectForBounds:(CGRect)bounds
{
    bounds.Origin.x += leftMargin;

    return bounds;
}

 - (CGRect)editingRectForBounds:(CGRect)bounds
{
    bounds.Origin.x += leftMargin;

    return bounds;
}
@end
44
Riad Krim
UITextField * textField = [[UITextField alloc]init];
[textField setDelegate:self];
[textField setFrame:CGRectMake(170,112,140,25)];
[textField setBorderStyle:UITextBorderStyleNone];
[textField setBackgroundColor:[UIColor clearColor]];
[self.View addSubview:noofChildTField];

UIView *paddingView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)] autorelease];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;

このコードを試してください

13
btmanikandan

Swift 3:の場合

UITextFieldのアウトレットを作成します。usernameTextFieldと言います。次に、viewDidLoad()に次のコードを記述します

let paddingView : UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
usernameTextField.leftView = paddingView
usernameTextField.leftViewMode = .always

変更 width: 5より大きなスペースが必要な場合は、より大きな値に設定します。

8
Mamta

プロパティインスペクターでIBの設定を確認して、この値を調整したいと思っていました。結局、配置と境界線のスタイルを、左側のパディングを乱した値にうっかり設定してしまったことがわかりました。

左揃えで境界線なしを選択するのは大したことではないと思うかもしれませんが、単語が基本的に重なり合ったり、ボックスの端まで来たりして、正しく見えません。

悪い:

enter image description here

良い:

enter image description here

私のために修正しました。これが他の誰かにも役立つことを願っています。

5
Ethan Parker

UITextFieldをサブクラス化し、拡張機能を追加します。

extension UITextField {
    func paddingLeft(inset: CGFloat){
        self.leftView = UIView(frame: CGRect(x: 0, y: 0, width: inset, height: self.frame.height))
        self.leftViewMode = UITextField.ViewMode.always
    }
}

使用法

class MyUITextFieldClass: UITextField {
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.paddingLeft(inset: 10)
    }
}
3
Claytog

- (CGRect)textRectForBounds:(CGRect)boundsをオーバーライドすることでほぼ到達しました。 TextFieldが編集モードになると、左マージンがゼロにリセットされます。

@implementation UITextField(UITextFieldCatagory)

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect theRect=CGRectMake(bounds.Origin.x+10, bounds.Origin.y, bounds.size.width-10, bounds.size.height);
    return theRect;


}
1
iOSPawan

Swift 4の場合:

IBDesignableクラスとIBInspectableプロパティを使用して、Xcodeストーリーボードを介してパディングを設定し、再利用できるようにすることを好みます。また、Swift 4.で動作するようにコードを更新しました。

import Foundation
import UIKit

@IBDesignable
class PaddableTextField: UITextField {

    var padding = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)

    @IBInspectable var left: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var right: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var top: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var bottom: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    func adjustPadding() {
         padding = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)

    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
         return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }
}
0
Payne Miller