Вид смещается вверх при нажатии текстового поля и появлении клавиатуры, даже если нет кода для перемещения вида вверх - PullRequest
0 голосов
/ 19 февраля 2019

Это очень странная проблема, которую мне не удалось решить.У меня есть UICollectionViewCell, названный DownloadUrlCell с некоторыми свойствами следующим образом:

class DownloadUrlCell: UICollectionViewCell {

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = .gray
        setupCellView()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    //MARK: properties
    let container: UIView = {
        let vi = UIView()
        vi.translatesAutoresizingMaskIntoConstraints = false
        vi.backgroundColor = .white
        vi.layer.cornerRadius = 5.0
        vi.addShadowToSelf()
        return vi
    }()

    let urlInputTF: UITextField = {
        let tf = UITextField()
        tf.translatesAutoresizingMaskIntoConstraints = false
        tf.borderStyle = .roundedRect
        tf.textColor = .black
        tf.font = UIFont.systemFont(ofSize: 13)
        return tf
    }()

    //MARK: setup methods
    func setupCellView() {
        setupContainer()
        addUrlTFAndBtn()
    }

    func setupContainer() {
        self.addSubview(container)

        container.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true
        container.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -10).isActive = true
        container.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 5).isActive = true
        container.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -5).isActive = true
    }

    func addUrlTFAndBtn() {
        //urlInputTF.delegate = self
        container.addSubview(urlInputTF)

        urlInputTF.topAnchor.constraint(equalTo: container.topAnchor, constant: 0).isActive = true
        urlInputTF.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 0).isActive = true
        urlInputTF.trailingAnchor.constraint(equalTo: container.leadingAnchor, constant: 0).isActive = true
        urlInputTF.heightAnchor.constraint(equalToConstant: 40).isActive = true
    }
}

В UICollectionViewCell (DownloadUrlCell) есть контейнер, в котором есть UITextField, и что всекод этой ячейки, ничего больше.

Теперь, когда я нажимаю на текстовое поле, вид смещается вверх на высоту клавиатуры. Я не добавил ни одного кода для смены вида .Я понятия не имею, почему это происходит, и не смог найти подобные вопросы в стеке или где-либо еще Я не использовал сторонние библиотеки .

Edit1 : Хорошо, я загрузил демонстрационный проект с той же проблемой.Текстовое поле находится в третьей ячейке (названной: DownloadUrlCell).Ниже приведена ссылка на проект github:

https://github.com/AfnanAhmadiOSDev/VDProjectDemo.git

Edit2 : Итак, попробовав несколько других вещей, я пришел к выводу, что проблема существуеттолько в UICollectionViewCell.Если я добавлю текстовое поле в любое UIViewController, оно будет работать без проблем, но если я добавлю текстовое поле внутри UICollectionViewCell, а затем коснусь текстового поля, вид сместится вверх.

Ниже приведен простой проект сUICollectionViewController и простая ячейка.Ничего другого в проекте, но проблема все еще остается.

https://github.com/AfnanAhmadiOSDev/VDSimpleDemo

Edit3 : Так что, покопавшись, я нашел этот ответ, который действительно помог.Однако причина остается неясной.

Решение: https://stackoverflow.com/a/51980844/10758374

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Это не работает, потому что вы должны добавить эти две строки в вашем setupCollectionView ()

func setupCollectionView(){
    self.collectionView?.backgroundColor = .gray
    self.collectionView?.isPagingEnabled = true
    self.collectionView?.register(HomeCell.self, forCellWithReuseIdentifier: "homecellid")
    self.collectionView?.register(VideoListCell.self, forCellWithReuseIdentifier: "secondcellid")
    self.collectionView?.register(DownloadUrlCell.self, forCellWithReuseIdentifier: "DownloadUrlCellid")
    self.collectionView?.register(FourthCell.self, forCellWithReuseIdentifier: "FourthCellid")
    self.collectionView?.contentInset = UIEdgeInsetsMake(65, 0, 0, 0)
    self.collectionView?.bounces = false
    self.collectionView?.showsHorizontalScrollIndicator = false
    self.collectionView?.showsVerticalScrollIndicator = false
    if #available(iOS 11.0, *) {
        self.collectionView?.contentInsetAdjustmentBehavior = .never
    } else {
        automaticallyAdjustsScrollViewInsets = false
    }
}

И ваш результат будет:

enter image description here

0 голосов
/ 19 февраля 2019

Для iOS 11 есть возможность отключить этот тип прокрутки.

Добавьте следующий код в setupCollectionView() метод, чтобы исправить вашу проблему.

    func setupCollectionView(){

        ....
        ....

        if #available(iOS 11.0, *) {
            self.collectionView?.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }
    }

Я надеюсь, что этопоможет тебе.

...