首页 > 解决方案 > 是否可以在 UITextField 的左视图中使用自动布局?

问题描述

我想使用根据其内容自动调整大小的视图UITextField自定义 a :leftView

func set(leftImage image: UIImage) {
    let imageView = UIImageView(image: image)
    let paddingContainer = UIView()
    // This is the crucial point:
    paddingContainer.translatesAutoresizingMaskIntoConstraints = false
    paddingContainer.addSubview(imageView)
    imageView.pin(toMarginsOf: paddingContainer)
    leftView = paddingContainer
    leftViewMode = .always
}

pin方法只是将所有四个侧面的图像视图固定到的边缘paddingContainer

func pin(toMarginsOf view: UIView) {
    translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor),
        .bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor),
        leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor),
        trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor)
    ])
}

在 iOS 12 上,一切都按预期工作,但在 iOS 版本 < 12 上,图像完全放错了位置。它甚至不在文本字段的范围内,而是在我的视图控制器视图的左上角。

在我看来,旧版本的 iOS 似乎不支持在您设置为文本字段的视图内使用自动布局leftView。该文档指出:

左侧覆盖视图放置在leftViewRect(forBounds:)接收方方法返回的矩形中。

但它没有说明它是如何放置在那里的:通过使用约束或直接设置框架。

如果完全支持使用自动布局,是否有任何可靠的来源或有根据的猜测leftView

标签: iosautolayoutuitextfieldicons

解决方案


extension UITextField{
func setLeft(image: UIImage, withPadding padding: CGFloat = 0) {
        let wrapperView = UIView.init(
            frame: CGRect.init(
                x: 0,
                y: 0,
                width: bounds.height,
                height: bounds.height
            )
        )
        let imageView = UIImageView()
        imageView.image = image
        imageView.contentMode = .scaleAspectFit
        wrapperView.addSubview(imageView)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            imageView.leadingAnchor.constraint(
                equalTo: wrapperView.leadingAnchor,
                constant: padding
            ),
            imageView.trailingAnchor.constraint(
                equalTo: wrapperView.trailingAnchor,
                constant: -padding
            ),
            imageView.topAnchor.constraint(
                equalTo: wrapperView.topAnchor,
                constant: padding
            ),
            imageView.bottomAnchor.constraint(
                equalTo: wrapperView.bottomAnchor,
                constant: -padding
            )
            ])
        leftView = wrapperView
        leftViewMode = .always
    }
}

希望这会有所帮助


推荐阅读