Как установить константу NSLayoutConstraint в ячейке collectionView? - PullRequest
0 голосов
/ 27 ноября 2018

В моей раскадровке у меня есть набор ограничений для подпредставления (называемого миниатюрой) в ячейке

enter image description here

Затем в моей пользовательской ячейке collectionView:

class PostViewCell: UICollectionViewCell {

var portrait: Bool? {
    didSet {
        if portrait == true {
            print(self.bounds.height)
            thumbnailWidthConstraint.constant = self.bounds.width
            thumbnailHeightConstraint.constant = self.bounds.height/2
            thumbnailHeightConstraint.isActive = true
        } else {
            thumbnailWidthConstraint.constant = self.bounds.width/2
            thumbnailHeightConstraint.constant = self.bounds.height
        }
        self.layoutIfNeeded()
    }
}
@IBOutlet weak var thumbnailCenterYConstraint: NSLayoutConstraint!
@IBOutlet weak var thumbnailWidthConstraint: NSLayoutConstraint!
@IBOutlet weak var thumbnailHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var thumbnailCenterXConstraint: NSLayoutConstraint!

override func layoutSubviews() {
    if self.bounds.width > self.bounds.height {
        portrait = false
    } else {
        portrait = true
    }
    super.layoutSubviews()
}

}

Моя цель - изменить высоту и ширину миниатюры, как вы видите в методе didSet переменной портрета,Однако пока это кажется неудачным.Он печатает self.bounds.height 536, и в приложении кажется, что это высота, а не половина высоты, которую я пытаюсь установить в ограничении.Какой шаг я пропускаю?Почему это не работает?Спасибо!

Редактировать: В моем контроллере представления, который содержит ячейки collectionView, у меня есть:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    postsCollectionView.collectionViewLayout.invalidateLayout()
    postsCollectionView.layoutIfNeeded()
    super.viewWillTransition(to: size, with: coordinator)
}

это представление коллекции называется "postsCollectionView" в моем контроллере представления.Кроме того, у меня есть это:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    if collectionView == timelineCollectionView {
        return CGSize(width: CGFloat(2.5), height: collectionView.bounds.height)
    } else {
        return CGSize(width: collectionView.bounds.size.width, height: collectionView.bounds.size.height)
    }
}

Таким образом, когда я поворачиваю телефон, и collectionView становится шире, чем он высокий, так же как и ячейка внутри.Надеемся, что это заставляет ячейку переупорядочивать подпредставления и изменять ограничения, как я определил.

1 Ответ

0 голосов
/ 27 ноября 2018

Вы можете пропустить изменение макета после изменения постоянной

var portrait: Bool? {
    didSet {
        if portrait == true {
            print(self.bounds.height)
            thumbnailWidthConstraint.constant = self.bounds.width
            thumbnailHeightConstraint.constant = self.bounds.height/2
            thumbnailHeightConstraint.isActive = true
        } else {
            thumbnailWidthConstraint.constant = self.bounds.width/2
            thumbnailHeightConstraint.constant = self.bounds.height
        }

        self.layoutIfNeeded() // or  self.contentView.layoutIfNeeded() 
    }
}

Вам также необходимо реагировать на изменения ориентации системы

func viewWillTransition(to size: CGSize, 
               with coordinator: UIViewControllerTransitionCoordinator) {
  collectionView.collectionViewLayout.invalidateLayout()
  collectionView.layoutIfNeeded()
}
...