Проблема перекрытия UITextField leftView и rightView - iOS13 - PullRequest
0 голосов
/ 11 октября 2019

Это похоже на UITextField rightView перекрывает выравнивание текста по правому краю , но мне трудно понять, как это исправить:

enter image description here

Перекрытие происходит на ios 13.1, когда я устанавливаю borderStyle = .none, если присутствует border, текст не перекрывает изображение.

    public func addRightImage(_ image: UIImage, accessibilityIdentifier: String? = nil,
                              size: CGSize) {
        self.rightViewMode = .always
        let widthImageView : CGFloat = 25

        let rightImageView = UIImageView(frame: .init(x: 0, y: 0, width: widthImageView, height: self.bounds.size.height))
        rightImageView.accessibilityIdentifier = accessibilityIdentifier
        rightImageView.image = image
        if #available(iOS 13, *) {
            self.rightView = rightImageView
        } else {
            assert(self.rightImageView == nil)
            let widthView : CGFloat = is4incher ? 30 : 50

            let rightView = UIView(frame: .init(x: 0, y: 0, width: widthView, height: self.bounds.size.height))
                       rightView.isUserInteractionEnabled = false
                        self.rightView = rightView
            rightView.addSubview(rightImageView)

            rightView.isUserInteractionEnabled = false
            self.rightView = rightView

            rightImageView.anchors(centerX: rightView.centerXAnchor, centerY: rightView.centerYAnchor,
                                   size: size)
        }
        rightImageView.set(color: self.textColor ?? .white)
        rightImageView.contentMode = .scaleAspectFit
        self.rightImageView = rightImageView
    }

, если я избавляюсь от

    if #available(iOS 13, *) {
        self.rightView = rightImageView

и, таким образом, перейдите по пути ios12, изображение центрировано в UITextField, а текст пропал вообще: enter image description here

Могу ли я что-нибудь сделать, чтобы исправить свой код, или мне нужносообщить об ошибке в Apple, если мой код выглядит нормально?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Swift 5 - iOS13

До iOS 13 UITextField предполагал, что кадры его leftView и rightView были правильно установлены при назначении и никогда не изменятся.

Начиная с iOS 13, реализация leftViewRect(forBounds:) и rightViewRect(forBounds:) теперь запрашивает представление для systemLayoutSizeFitting(_:).

Чтобы добиться прежнего поведения при связывании и запуске в iOS 13, добавьте явные ограничения размеров для представления, оберните его в простой UIView или создайте подкласс представления и реализуйте systemLayoutSizeFitting(_:)


Переопределение метода в классе textField

override func rightViewRect(forBounds bounds: CGRect) -> CGRect {
    return CGRect(x: bounds.width - 50, y: 0, width: 30 , height: bounds.height)
    }

Ссылочная ссылка - https://howtotechglitz.com/apple-has-just-released-ios-13-developer-beta-5-for-iphone-ios-iphone-gadget-hacks/

Надеюсь, это вам поможет.

0 голосов
/ 11 октября 2019

Добавить ширина constraint к rightView / leftView.

Не забудьте установить translatesAutoresizingMaskIntoConstraints = false

rightView.translatesAutoresizingMaskIntoConstraints = false
rightView.widthAnchor.constraint(equalToConstant: <#NeededWidth#>).isActive = true
// This is enough to make it act like before but you can set other missing constraints like height to suppress layout warnings and prevent further issues.
// rightView.widthAnchor.constraint(equalToConstant: <#HeightOfTheTextField#>).isActive = true

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

И обратите внимание, что если rightView / leftView - это что-то вроде StackView, попробуйте поместить его в view, а затем добавьте это представление вместо.

- Дополнительная информация

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

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

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

...