Можно ли использовать автоматическую компоновку в левом окне UITextField? - PullRequest
0 голосов
/ 18 октября 2018

Я хочу настроить UITextField 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 изображение совершенно неуместно.Это даже не в пределах текстового поля, а в верхнем левом углу представления моего контроллера представления. </p>

Мне кажется, что более старые версии iOS не поддерживают использование Auto Layout внутри установленного представлениякак текстовое поле leftView.Документация гласит:

Вид с наложением слева помещается в прямоугольник, возвращаемый методом leftViewRect(forBounds:) получателя.

, но не указывает как он там находится: используя ограничения или устанавливая фрейм напрямую.

Есть ли надежные источники или обоснованные предположения, если использование Auto Layout вообще поддерживается для leftView?

1 Ответ

0 голосов
/ 18 октября 2018
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
    }
}

надеюсь, это поможет

...