iOS7上UITextfield左/右视图填充问题

95

iOS7 下的 UITextField 的 leftView 和 rightView 紧贴着边框,如何添加一些(水平)内边距呢?我试过修改 frame,但没有用。

uint padding = 10;//padding for iOS7
UIImageView * iconImageView = [[UIImageView alloc] initWithImage:iconImage];    
iconImageView.frame = CGRectMake(0 + padding, 0, 16, 16);
textField.leftView = iconImageView;
请注意,我对在文本字段的文本中添加填充不感兴趣,例如这样的做法:设置UITextField的填充和UITextBorderStyleNone

可能是 UITextField 的文本缩进? 的重复问题。 - Zorayr
1
不,这是在询问如何缩进作为文本字段中leftView显示的图像,而不是缩进文本本身。尝试使用他的代码,你会发现将leftView设置为图像会将该图像放置在文本字段的左边缘,没有填充。它看起来很丑。 - stone
28个回答

4

你可以设置一个空视图,并将你的视图嵌入其中作为子视图:

let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50.0, height: 50.0))
imageView.contentMode = .center
imageView.image = UIImage(named: "ic_dropdown")
let emptyView = UIView(frame: CGRect(x: 0, y: 0, width: 50.0, height: 50.0))
emptyView.backgroundColor = .clear
emptyView.addSubview(imageView)
self.documentTypeTextLabel.rightView = emptyView
self.documentTypeTextLabel.rightViewMode = .always

这里输入图片描述

愉快的编码


3
我在某个地方找到了这个东西...
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
paddingView.backgroundColor = [UIColor clearColor];
itemDescription.leftView = paddingView;
itemDescription.leftViewMode = UITextFieldViewModeAlways;

[self addSubview:itemDescription];

5
这只是为文本添加填充,这不是提问者寻找的内容。他不想要一个清晰的leftView。他希望一幅图像显示为leftView。 - stone
你可以将图片添加到paddingView中。 - Matheus Weber

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 的子类,但我认为这是最清晰的方法。


1
- (CGRect)rightViewRectForBounds:(CGRect)bounds
{
    return CGRectMake(bounds.size.width - 40, 0, 40, bounds.size.height);
}

如果UITextField嵌入到了一个UISearchBar中,你如何告诉UISearchBar使用你的UITextField子类? - crishoj

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的高度,请根据您的需求进行调整。


1
创建一个自定义的UITextField类,并使用该类代替UITextField。重写- (CGRect) textRectForBounds:(CGRect)bounds方法以设置所需的矩形。
示例
- (CGRect)textRectForBounds:(CGRect)bounds{
     CGRect textRect = [super textRectForBounds:bounds];
     textRect.origin.x += 10;
     textRect.size.width -= 10;
     return textRect;
}

1
这里有一个解决方案:
 UIView *paddingTxtfieldView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 42)]; // what ever you want 
 txtfield.leftView = paddingTxtfieldView;
 txtfield.leftViewMode = UITextFieldViewModeAlways;

问题是关于在左/右视图中添加填充,您正在使用您的解决方案替换左右视图! - Tejas K

1
我在我的ViewController类中创建了一个自定义方法,如下所示:
- (void) modifyTextField:(UITextField *)textField
{
    // Prepare the imageView with the required image
    uint padding = 10;//padding for iOS7
    UIImageView * iconImageView = [[UIImageView alloc] initWithImage:iconImage];    
    iconImageView.frame = CGRectMake(0 + padding, 0, 16, 16);

    // Set the imageView to the left of the given text field.
    textField.leftView = iconImageView;
    textField.leftViewMode = UITextFieldViewModeAlways;
}

现在我可以在 (viewDidLoad 方法) 中调用该方法并将任何一个 TextFields 发送到该方法中,为左右两侧添加填充,并通过编写一行代码来设置文本和背景颜色,如下所示:
[self modifyTextField:self.firstNameTxtFld];

这在iOS 7上完美运行!希望这在iOS 8和9上也能正常工作!

我知道添加太多视图可能会使加载对象变得更加笨重。但在考虑其他解决方案的困难性时,我发现自己更倾向于这种方法,并更灵活地使用这种方式。 ;)

希望这个答案对别人找到另一个解决方案有所帮助或有用。

干杯!


1
如果您将UIImageView用作leftView,则必须使用此代码: < p >注意:不要在viewWillAppear或viewDidAppear中使用< /em>< /p>
-(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;
}

1

使用 Swift 4.2 设置 UITextField 的 RightView。

TxtPass.rightViewMode = UITextField.ViewMode.always
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 18, height: 18))
imageView.contentMode = UIView.ContentMode.scaleAspectFit
let image = UIImage(named: "hidepass")
imageView.image = image
let rightView = UIView(frame: CGRect(x: 0, y: 0, width: 28, height: 18))
rightView.addSubview(imageView)
rightView.contentMode = UIView.ContentMode.left
TxtPass.rightView = rightView

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接