IOS 13: проблема с пробелами в UITextField rightView - PullRequest
4 голосов
/ 30 сентября 2019

Я сталкиваюсь с проблемой пробелов при правильном просмотре UITextField в IOS 13, см. Мой следующий код и снимок экрана с ios 13 и ios 12.4

В IOS 12.4 симулятор отображает правильное пространство в правильном представлении (UIButton) UITextField

В IOS 13.0 симулятор имеет проблему с пробелами в правом представлении (UIButton) UITextField

let dropdownButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: txtField.frame.height))
dropdownButton.backgroundColor = UIColor.clear
dropdownButton.setImage(UIImage(named: "ic_DownArrow"), for: UIControl.State())            
txtField.rightView = dropdownButton           
txtField.rightViewMode = .always

enter image description here enter image description here

Ответы [ 4 ]

7 голосов
/ 30 сентября 2019

Очевидно, это было изменение в поведении rightViewRect (forBounds :) в iOS 13 Beta 5.

Из примечаний к выпуску iOS 5 для iOS и iPadOS 13:

UIKit - решенные проблемы

До iOS 13 UITextField предполагал, что кадры его leftView и rightView были правильно установлены при назначении и никогда не изменятся. Начиная с iOS 13, реализация leftViewRect (forBounds :) и rightViewRect (forBounds :) теперь запрашивает представление для его systemLayoutSizeFitting (:). Чтобы добиться предыдущего поведения при связывании и запуске в iOS 13, добавьте явные ограничения размеров для представления, оберните его в простой UIView или создайте подкласс представления и реализуйте systemLayoutSizeFitting (:). (51787798)

Поэтому добавьте ограничения автоматического размещения в свой пользовательский вид, который вы добавили в rightView

Пример: -

override func rightViewRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: bounds.width - 30, y: 0, width: 20 , height: bounds.height)
    }
2 голосов
/ 30 сентября 2019

Я заставил его работать, используя метод Бруно.

1) Создайте контейнерное представление и установите его ширину и высоту, используя автоматическое расположение. Ширина и высота должны включать размер подпредставления + требуемый интервал.

2) Создайте подпредставление, которое вы хотите отобразить в текстовом поле. Установите ширину, высоту и расположение, используя автоматическое расположение. Добавьте его в представление контейнера.

3) Добавьте представление контейнера в текстовое поле

Вы можете видеть, что мой контейнер соответствует высоте текстового поля. Ширина - это ширина кнопки (44) плюс желаемый интервал (16). Когда я добавлю свое подпредставление, я выровняю его слева от контейнера. Это даст мне 16px интервал между правой кнопкой и краем текстового поля.

let forgotButtonContainer = UIView()
forgotButtonContainer.translatesAutoresizingMaskIntoConstraints = false
forgotButtonContainer.widthAnchor.constraint(equalToConstant: 44.0 + 16.0).isActive = true
forgotButtonContainer.heightAnchor.constraint(equalToConstant: 48.0).isActive = true

forgotButton = PFSecondaryButton(link: "Forgot?")
forgotButton.translatesAutoresizingMaskIntoConstraints = false
forgotButtonContainer.addSubview(forgotButton)

forgotButton.topAnchor.constraint(equalTo: forgotButtonContainer.topAnchor).isActive = true
forgotButton.leftAnchor.constraint(equalTo: forgotButtonContainer.leftAnchor).isActive = true
forgotButton.bottomAnchor.constraint(equalTo: forgotButtonContainer.bottomAnchor).isActive = true

passwordField.rightView = forgotButtonContainer
0 голосов
/ 30 октября 2019

Я решаю ту же проблему, установив это:

переопределить метод textField rightViewRectForBounds:,

- (CGRect)rightViewRectForBounds:(CGRect)bounds {
    if (self.rightView) {
        CGRect rightFrame = self.rightView.frame;
        return CGRectMake(bounds.size.width - rightFrame.size.width, 0, rightFrame.size.width, bounds.size.height);
    }
    return CGRectZero;
}
0 голосов
/ 30 сентября 2019

Возможно, ваше изображение меньше width: 50, height: txtField.frame.height, поэтому ваша кнопка уменьшена.

Вы можете попробовать добавить контейнер:

let dropdownButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: txtField.frame.height))
dropdownButton.backgroundColor = .clear
dropdownButton.setImage(UIImage(named: "ic_DownArrow"), for: UIControl.State())
let container = UIView(frame: dropdownButton.frame)
container.backgroundColor = .clear
container.addSubview(dropdownButton)
txtField.rightView = container
txtField.rightViewMode = .always
...