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个回答

1
这对我来说就像我正在寻找的一样有效:

func addImageViewInsideMyTextField() {
    let someView = UIView(frame: CGRect(x: 0, y: 0, width: 40, height: 24))
    let imageView = UIImageView(image: UIImage(named: "accountImage"))
    imageView.frame = CGRect(x: 16, y: 0, width: 24, height: 24)
    imageView.contentMode = .scaleAspectFit
    someView.addSubview(imageView)

    self.myTextField.leftView = someView
    self.myTextField.leftViewMode = .always
}

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
...

0
...
textField.rightView = UIImageView(image: ...)
textField.rightView?.contentMode = .top
textField.rightView?.bounds.size.height += 10
textField.rightViewMode = .always
...

0
一个小技巧:将包含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;

0
最简单的方法就是将文本字段更改为RoundRect而不是Custom,然后看看魔法。 :)

0

我自己也遇到过这个问题,最简单的解决方法是修改你的图片,在每个边上添加填充!

我只是改变了我的png图像,添加了10像素的透明填充,它很好地工作,完全不需要编码!


0

我意识到这是一个旧帖子,我的答案有点特定于我的用例,但我发布它是为了让其他人寻找类似的解决方案。我想移动UITextField的leftView或rightView,但我没有在其中放置图像,也不想使用任何硬编码常量。

我的UI需要隐藏文本字段的清除按钮,并在清除按钮所在位置显示UIActivityIndicatorView。

我将旋转器添加到rightView中,但是默认情况下(在iOS 13上),它向右偏移20个像素clearButton。我不喜欢使用魔术数字,因为Apple随时可能更改clearButton和rightView的位置。 UI设计意图是“旋转器在清除按钮的位置”,因此我的解决方案是子类化UITextField并覆盖rightViewRect(forBounds)

override func rightViewRect(forBounds bounds: CGRect) -> CGRect {

    // Use clearButton's rectangle
    return self.clearButtonRect(forBounds: bounds)
}

以下是一个可工作的示例(不包括Storyboard):
//------------------------------------------------------------------------------
class myCustomTextField: UITextField {

    override func rightViewRect(forBounds bounds: CGRect) -> CGRect {

        // Use clearButton rectangle
        return self.clearButtonRect(forBounds: bounds)
    }
}

//------------------------------------------------------------------------------
class myViewController: UIViewController {

    var activityView: UIActivityIndicatorView = {
        let activity = UIActivityIndicatorView()
        activity.startAnimating()
        return activity
    }()

    @IBOutlet weak var searchTextField: myCustomTextField!

    //------------------------------------------------------------------------------
    // MARK: - Lifecycle
    //------------------------------------------------------------------------------
    override func viewDidLoad() {

        super.viewDidLoad()

        searchTextField.rightView = activityView
        searchTextField.rightViewMode = .never // Hide spinner
        searchTextField.clearButtonMode = .never // Hide clear button

        setupUIForTextEntry()
    }

    // ...
    // More code to switch between user text entry and "search progress" 
    // by calling setupUI... functions below
    // ...

    //------------------------------------------------------------------------------
    // MARK: - UI
    //------------------------------------------------------------------------------
    func setupUIForTextEntry() {

        // Hide spinner
        searchTextField.rightViewMode = .never

        // Show clear button
        searchTextField.clearButtonMode = .whileEditing
        searchTextField.becomeFirstResponder()
    }

    //------------------------------------------------------------------------------
    func setupUIForSearching() {

        // Show spinner
        searchTextField.rightViewMode = .always

        // Hide clear button
        searchTextField.clearButtonMode = .never
        searchTextField.resignFirstResponder()
    }

    //------------------------------------------------------------------------------

}

//------------------------------------------------------------------------------

-1

简单方法:

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

注意:高度应小于宽度,以允许水平填充。

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