95

iOS7 の UITextField の leftView および rightView ビューは、テキスト フィールドの境界に非常に近いです。

これらのアイテムに (水平) パディングを追加するにはどうすればよいですか?

フレームを変更しようとしましたが、うまくいきませんでした

uint padding = 10;//padding for iOS7
UIImageView * iconImageView = [[UIImageView alloc] initWithImage:iconImage];    
iconImageView.frame = CGRectMake(0 + padding, 0, 16, 16);
textField.leftView = iconImageView;

このSet padding for UITextField with UITextBorderStyleNoneのように、テキストフィールドのテキストにパディングを追加することに興味がないことに注意してください

4

28 に答える 28

168

を利用する、より単純なソリューションcontentMode:

    arrow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"down_arrow"]];
    arrow.frame = CGRectMake(0.0, 0.0, arrow.image.size.width+10.0, arrow.image.size.height);
    arrow.contentMode = UIViewContentModeCenter;

    textField.rightView = arrow;
    textField.rightViewMode = UITextFieldViewModeAlways;

スイフト3では、

    let arrow = UIImageView(image: UIImage(named: "arrowDrop"))
    if let size = arrow.image?.size {
        arrow.frame = CGRect(x: 0.0, y: 0.0, width: size.width + 10.0, height: size.height)
    }
    arrow.contentMode = UIViewContentMode.center
    self.textField.rightView = arrow
    self.textField.rightViewMode = UITextFieldViewMode.always
于 2014-06-24T13:53:41.410 に答える
95

自分でこれに取り組んでいて、このソリューションを使用していました:

- (CGRect) rightViewRectForBounds:(CGRect)bounds {

    CGRect textRect = [super rightViewRectForBounds:bounds];
    textRect.origin.x -= 10;
    return textRect;
}

これにより、iOS 7 で画像が端に押し付けられる代わりに、画像が右から 10 だけ移動します。

さらに、これは のサブクラスにあり、次のUITextField方法で作成できます。

  1. UITextFieldデフォルトの代わりに のサブクラスである新しいファイルを作成しますNSObject
  2. - (id)initWithCoder:(NSCoder*)coder画像を設定するという名前の新しいメソッドを追加します

    - (id)initWithCoder:(NSCoder*)coder {
        self = [super initWithCoder:coder];
    
        if (self) {
    
            self.clipsToBounds = YES;
            [self setRightViewMode:UITextFieldViewModeUnlessEditing];
    
            self.leftView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"textfield_edit_icon.png"]];
        }
    
        return self;
    }
    
  3. インポートする必要がある場合があります#import <QuartzCore/QuartzCore.h>

  4. rightViewRectForBounds上記のメソッドを追加

  5. Interface Builder で、サブクラス化する TextField をクリックし、class 属性をこの新しいサブクラスの名前に変更します。

于 2013-10-15T04:10:04.300 に答える
50

最も簡単な方法は、UIView を leftView/righView に追加し、ImageView を UIView に追加し、UIView 内の ImageView の原点を好きな場所に調整することです。これは私にとって魅力的でした。数行のコードしか必要ありません

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 5, 26, 26)];
imgView.image = [UIImage imageNamed:@"img.png"];

UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
[paddingView addSubview:imgView];
[txtField setLeftViewMode:UITextFieldViewModeAlways];
[txtField setLeftView:paddingView];
于 2014-06-27T11:48:15.747 に答える
15

これはSwiftに最適です:

let imageView = UIImageView(image: UIImage(named: "image.png"))
imageView.contentMode = UIViewContentMode.Center
imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 20.0, imageView.image!.size.height)
textField.rightViewMode = UITextFieldViewMode.Always
textField.rightView = imageView
于 2015-07-31T17:08:00.977 に答える
8

これは私のために働く

UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)];
self.passwordTF.leftView = paddingView;
self.passwordTF.leftViewMode = UITextFieldViewModeAlways;

お役に立てますように。

于 2015-08-01T04:57:14.657 に答える
5

imageView や image を操作する代わりに、apple が提供する rightView のメソッドをオーバーライドできます。

class CustomTextField : UITextField { 

override func rightViewRect(forBounds bounds: CGRect) -> CGRect {
    let offset = 5
    let width  = 20
    let height = width
    let x = Int(bounds.width) - width - offset
    let y = offset
    let rightViewBounds = CGRect(x: x, y: y, width: width, height: height)
    return rightViewBounds
}}

同様に、左ビューの func 以下をオーバーライドできます。

override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
    /*return as per requirement*/

}
于 2019-03-07T10:40:39.120 に答える
4

これを行う最善の方法は、UITextField のサブクラスを使用して .m ファイルでクラスを作成することです。

  #import "CustomTextField.h"
  #import <QuartzCore/QuartzCore.h>
  @implementation CustomTextField


- (id)initWithCoder:(NSCoder*)coder 
 {
self = [super initWithCoder:coder];

if (self) {

    //self.clipsToBounds = YES;
    //[self setRightViewMode:UITextFieldViewModeUnlessEditing];

    self.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,15,46)];
    self.leftViewMode=UITextFieldViewModeAlways;
      }

return self;

}

これを行うと、ストーリーボードまたは xib に移動し、ID インスペクターをクリックして、クラス オプションで UITextfield を独自の「CustomTextField」に置き換えます。

注: テキストフィールドに自動レイアウトでパディングを与えるだけでは、アプリケーションは実行されず、空白の画面しか表示されません。

于 2015-03-19T08:26:48.990 に答える
3

これどこかで見つけた…

UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
paddingView.backgroundColor = [UIColor clearColor];
itemDescription.leftView = paddingView;
itemDescription.leftViewMode = UITextFieldViewModeAlways;

[self addSubview:itemDescription];
于 2013-10-14T23:45:06.753 に答える
1
- (CGRect)rightViewRectForBounds:(CGRect)bounds
{
    return CGRectMake(bounds.size.width - 40, 0, 40, bounds.size.height);
}
于 2015-04-21T09:59:27.917 に答える
1

驚いたことに、必要なパディングを提供しながら、正しいビュー画像をテキストフィールドに実際に適合させるものはありませんでした。次に、AspectFill モードを使用することを考えたところ、奇跡が起こりました。将来のシーカーのために、私が使用したものは次のとおりです。

UIImageView *emailRightView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
emailRightView.contentMode = UIViewContentModeScaleAspectFill;
emailRightView.image = [UIImage imageNamed:@"icon_email.png"];
emailTextfield.rightViewMode = UITextFieldViewModeAlways;
emailTextfield.rightView = emailRightView;

imageview のフレーム内の 35 は、emailTextfield の高さを表しています。必要に応じて自由に調整してください。

于 2015-05-14T19:32:07.440 に答える
1

UIImageView を leftView として使用している場合は、次のコードを使用する必要があります。

注意 : viewWillAppear または viewDidAppear 内で使用しないでください

-(UIView*)paddingViewWithImage:(UIImageView*)imageView andPadding:(float)padding
{
    float height = CGRectGetHeight(imageView.frame);
    float width =  CGRectGetWidth(imageView.frame) + padding;

    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];

    [paddingView addSubview:imageView];

    return paddingView;
}
于 2015-09-20T19:30:11.917 に答える
1

ここに1つの解決策があります:

 UIView *paddingTxtfieldView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 42)]; // what ever you want 
 txtfield.leftView = paddingTxtfieldView;
 txtfield.leftViewMode = UITextFieldViewModeAlways;
于 2013-10-15T05:32:29.627 に答える
1

以下の例は、たまたまアイコンである左側のビューに水平パディングを追加するためのものです。同様のアプローチUIViewを使用して、テキストフィールドの左側のビューとして使用したいものにパディングを追加できます。

UITextFieldサブクラス内:

static CGFloat const kLeftViewHorizontalPadding = 10.0f;

@implementation TextFieldWithLeftIcon
{
  UIImage *_image;
  UIImageView *_imageView;
}

- (instancetype)initWithFrame:(CGRect)frame image:(UIImage *)image
{
  self = [super initWithFrame:frame];
  if (self) {
    if (image) {
      _image = image;
      _imageView = [[UIImageView alloc] initWithImage:image];
      _imageView.contentMode = UIViewContentModeCenter;
      self.leftViewMode = UITextFieldViewModeAlways;
      self.leftView = _imageView;
    }
  }
  return self;
}

#pragma mark - Layout 

- (CGRect)leftViewRectForBounds:(CGRect)bounds
{
  CGFloat widthWithPadding = _image.size.width + kLeftViewHorizontalPadding * 2.0f;
  return CGRectMake(0, 0, widthWithPadding, CGRectGetHeight(bounds));
}

ここではサブクラス化UITextFieldしていますが、これが最もクリーンなアプローチだと思います。

于 2014-12-23T00:03:00.323 に答える
0

1 つのトリック: UIImageView を含む UIView を UITextField に rightView として追加します。この UIView はサイズを大きくする必要があります。UIImageView をその左側に配置します。そのため、右からスペースがパディングされます。

// Add a UIImageView to UIView and now this UIView to UITextField - txtFieldDate
UIView *viewRightIntxtFieldDate = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 30)]; 
// (Height of UITextField is 30px so height of viewRightIntxtFieldDate = 30px)
UIImageView *imgViewCalendar = [[UIImageView alloc] initWithFrame:CGRectMake(0, 10, 10, 10)];
[imgViewCalendar setImage:[UIImage imageNamed:@"calendar_icon.png"]];
[viewRightIntxtFieldDate addSubview:imgViewCalendar];
txtFieldDate.rightViewMode = UITextFieldViewModeAlways;
txtFieldDate.rightView = viewRightIntxtFieldDate;
于 2014-01-14T11:38:42.733 に答える
0

最も簡単な方法は、Textfield を Custom ではなく RoundRect に変更して魔法を確認することです。:)

于 2016-03-17T12:25:12.250 に答える
0

Swift2 の場合、私は使用します

...
        self.mSearchTextField.leftViewMode = UITextFieldViewMode.Always
        let searchImg = UIImageView(image: UIImage(named: "search.png"))
        let size = self.mSearchTextField.frame.height
        searchImg.frame = CGRectMake(0, 0, size,size)
        searchImg.contentMode = UIViewContentMode.ScaleAspectFit
        self.mSearchTextField.leftView = searchImg
...
于 2016-05-23T15:07:57.690 に答える
0

簡単なアプローチ:

textField.rightViewMode = .always
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 25, height: 15))
textField.contentMode = .scaleAspectFit
imageView = UIImage(named: "imageName")
textField.rightView = imageView

注: 水平方向のパディングを可能にするために、高さは幅よりも小さくする必要があります。

于 2019-06-19T03:48:54.857 に答える