UICollectionViewCell изменяет высоту, когда клавиатура появляется быстро 4.2 - PullRequest
0 голосов
/ 14 марта 2019

Я работал над приложением, у которого есть UICollectionView, который работает как основной экран с UICollectionViewCells, действующими как разные страницы (с горизонтальной прокруткой).Я добавил текстовое поле в каждую ячейку для редактирования, но когда я щелкаю по текстовому полю, высота ячейки увеличивается при появлении клавиатуры.Когда клавиатура скрыта, высота ячейки остается увеличенной.Я искал ответ на эту проблему, но я не нашел решения, которое работает.

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

Ниже приведен мой код:

private let reuseIdentifier = ["Cell1", "Cell2", "Cell3", "Cell4", "Cell5"]

let navi_btn_array: [UIButton] = [navi_home_btn, navi_gavel_btn, navi_orders_btn, navi_profile_btn, navi_lightning_btn]
var collectionView: UICollectionView = {
    var layout = UICollectionViewFlowLayout();
    layout.sectionInset = UIEdgeInsets.zero
    var cv = UICollectionView(frame: .zero, collectionViewLayout: layout);
    cv.autoresizesSubviews = false
    cv.contentInset = UIEdgeInsets.zero
    cv.translatesAutoresizingMaskIntoConstraints = false;
    return cv;
}();

class MainCVC: UICollectionViewController,UICollectionViewDelegateFlowLayout, CLLocationManagerDelegate, UITextFieldDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()



        collectionView?.register(SimpleDispensaryPage_Cell.self, forCellWithReuseIdentifier: reuseIdentifier[0])
        collectionView?.delegate = self
        collectionView?.dataSource = self
        collectionView?.isPagingEnabled = true

        let nc:NotificationCenter = NotificationCenter.default
        nc.addObserver(self, selector: #selector(keyboardDidShow(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
        nc.addObserver(self, selector: #selector(keyboardDidHide(notification:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil)
    }

    @objc func keyboardDidShow(notification: Notification){

        collectionViewLayout.invalidateLayout()
        collectionView?.contentOffset.y = 0


    }
    @objc func keyboardDidHide(notification: Notification){

        collectionViewLayout.invalidateLayout()
        collectionView?.contentOffset.y = 0

    }



    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 5

    }
    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1

    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier[0], for: indexPath)
            cell.backgroundColor = Custom_Colors.color_pine.withAlphaComponent(0.5)
            var txt_fld = UITextField()
            txt_fld.frame = CGRect(x: 0, y: 50, width: 100, height: 50)
            cell_label.text = "Placeholder #"+String(indexPath.item)
            cell_label.textAlignment = .center
            cell.addSubview(cell_label)
            return cell
        }
    }

}

Я также получаю эту ошибку при запуске:

2019-03-14 11:41:20.770799-0700 app[57379:5390785] the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values.
2019-03-14 11:41:20.771043-0700 app[57379:5390785] The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7fda15c13f40>, and it is attached to <UICollectionView: 0x7fda1706f000; frame = (0 0; 375 730.8); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000447bc0>; layer = <CALayer: 0x600000437720>; contentOffset: {8, -38.333333333333336}; contentSize: {1891, 579}; adjustedContentInset: {0, 0, 151.79999999999995, 0}> collection view layout: <UICollectionViewFlowLayout: 0x7fda15c13f40>.
2019-03-14 11:41:20.771245-0700 app[57379:5390785] Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.

1 Ответ

0 голосов
/ 15 марта 2019

У вас здесь немного странная настройка.Я предлагаю внести пару изменений:

1 - Никогда не добавлять подпредставления в collectionView (_, cellForItemAt ...).Это приведет к множественным добавлениям каждый раз, когда ячейка используется повторно.Подвид должен быть добавлен в ячейку (и предпочтительно во время создания).

2 - Удалить cv.autoresizesSubviews = false и cv.translatesAutoresizingMaskIntoConstraints = false.

3 - если вы хотите фиксированный размер для своих ячеекВы можете установить layout.delegate = self и реализовать следующий метод:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
  return CGSize(width: screenWidth, height: screenHeight)
}

4 - Если вы действительно просто хотите пару страниц, почему бы вам не использовать UIPageViewController?

...