【问题标题】:How to get left padding on UITextField leftView image?如何在 UITextField leftView 图像上获得左填充?
【发布时间】:2015-09-11 13:45:32
【问题描述】:

我正在将UIImageView 设置为leftViewUITextField 上,如下所示:

UIImageView *envelopeView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.height*.1, self.height*.1)];
envelopeView.image = [UIImage imageNamed:@"envelope.png"];
envelopeView.contentMode = UIViewContentModeScaleAspectFit;
envelopeView.bounds = CGRectInset(envelopeView.frame, 15, 10);
self.emailAddress.leftView = envelopeView;
self.emailAddress.leftViewMode = UITextFieldViewModeAlways;

这让我得到以下信息:

正如您所见,即使我尝试设置插图,图像的左侧尺寸也会一直延伸到按钮的左边缘。我怎样才能把这个信封移进去,这样它的四面都有填充物?


更新:我尝试了像这样更改UIImageView 框架的建议答案,但信封仍然排列在UITextField 边界的左侧:

CGFloat padding = 20;
UIImageView *envelopeView = [[UIImageView alloc] initWithFrame:CGRectMake(3*padding, padding, self.height*.1-padding, self.height*.1-padding)];

【问题讨论】:

  • 您是否尝试更改 CGRectMake(5, 0, self.height*.1, self.height*.1)] 例如...

标签: ios objective-c uitextfield


【解决方案1】:

对于 Swift 3 用户

这对我有用:

extension UITextField {

 /// set icon of 20x20 with left padding of 8px 
 func setLeftIcon(_ icon: UIImage) {

    let padding = 8
    let size = 20

    let outerView = UIView(frame: CGRect(x: 0, y: 0, width: size+padding, height: size) )
    let iconView  = UIImageView(frame: CGRect(x: padding, y: 0, width: size, height: size))
    iconView.image = icon
    outerView.addSubview(iconView)

    leftView = outerView
    leftViewMode = .always  
  }
}

测试:

txOrigin.setLeftIcon(icon_location)

结果:

【讨论】:

  • 极好的解决方案
  • 仍然可以在 Swift 5 上完美运行!感谢兄弟拯救了我的一天!
【解决方案2】:

对于 Swift 4.2 +

你可以使用这个扩展:

extension UITextField {
    func leftImage(_ image: UIImage?, imageWidth: CGFloat, padding: CGFloat) {
        let imageView = UIImageView(image: image)
        imageView.frame = CGRect(x: padding, y: 0, width: imageWidth, height: frame.height)
        imageView.contentMode = .center
        
        let containerView = UIView(frame: CGRect(x: 0, y: 0, width: imageWidth + 2 * padding, height: frame.height))
        containerView.addSubview(imageView)
        leftView = containerView
        leftViewMode = .always
    }
}

【讨论】:

  • 像冠军一样工作!谢谢。也很容易为 rightView 复制。
【解决方案3】:

你可以试试这个:

    UIImageView *envelopeView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 0, 30, 30)];
    envelopeView.image = [UIImage imageNamed:@"comment-128.png"];
    envelopeView.contentMode = UIViewContentModeScaleAspectFit;
  UIView *test=  [[UIView alloc]initWithFrame:CGRectMake(20, 0, 30, 30)];
    [test addSubview:envelopeView];
    [self.textField.leftView setFrame:envelopeView.frame];
    self.textField.leftView =test;
        self.textField.leftViewMode = UITextFieldViewModeAlways;

【讨论】:

  • 刚试过这个,但没有效果。图像大致相同。
  • 你为 x 捐了多少钱?
  • x 不能是 CGFloat .. 它就像在 x 轴上,应该是某个整数。
  • @SimonaMi 你确定吗?我一直使用浮点数来表示 x。
  • 我总是将它与 int 一起使用,但你是对的,这是来自苹果文档 CGRect CGRectMake ( CGFloat x, CGFloat y, CGFloat width, CGFloat height ); developer.apple.com/library/ios/documentation/GraphicsImaging/…
【解决方案4】:

你可以使用它。根据需要更换框架。

NSTextAttachment*   placeholderImageTextAttachment = [[NSTextAttachment alloc] init];
placeholderImageTextAttachment.image = [UIImage imageNamed:@"Search"];
placeholderImageTextAttachment.bounds = CGRectMake(0, -2, 16, 16);
NSMutableAttributedString*  placeholderImageString = [[NSAttributedString attributedStringWithAttachment:placeholderImageTextAttachment] mutableCopy];
 NSMutableAttributedString*  placeholderString = [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"   Search", nil)];
[placeholderImageString appendAttributedString:placeholderString];
 _txtFieldSearch.attributedPlaceholder = placeholderImageString;
_txtFieldSearch.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

【讨论】: