Как настроить интервал в ячейке представления коллекции, совпадающей с передним краем заголовка панели навигации? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть UICollectionViewController, в котором я хочу отобразить ячейки представления коллекции, где левый край выровнен с заголовком панели навигации. Я, конечно, не хочу жестко кодировать интервал CGFloat 20 из-за различных размеров экрана устройства. Исходя из моего кода ниже, реализация отлично смотрится на iPhone 8+ и iPhone 11 Pro Max, но не на iPhone 11 (левый край ячейки представления коллекции больше вправо, чем край навигации заголовок панели, как показано на рисунке ниже моего кода).

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

private let reuseIdentifier = "Cell"

class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    private let spacing: CGFloat = 20 // CGFloat of 20 works well for the iPhone 8+ and iPhone 11 Pro Max, but not the iPhone 11 Pro

    override func viewDidLoad() {
        super.viewDidLoad()

        // Register cell classes
        self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

        // Setup layout
        let layout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: spacing, left: spacing, bottom: spacing, right: spacing)
        layout.minimumLineSpacing = spacing
        layout.minimumInteritemSpacing = spacing
        self.collectionView?.collectionViewLayout = layout
    }

    // MARK: UICollectionViewDataSource

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

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

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
        cell.backgroundColor = .systemFill
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let numberOfItemsPerRow: CGFloat = 2
        let spacingBetweenCells: CGFloat = spacing

        let totalSpacing = (2 * self.spacing) + ((numberOfItemsPerRow - 1) * spacingBetweenCells) // Amount of total spacing in a row

        if let collection = self.collectionView {
            let width = (collection.bounds.width - totalSpacing) / numberOfItemsPerRow
            return CGSize(width: width, height: width)
        } else {
            return CGSize(width: 0, height: 0)
        }
    }
}

enter image description here

1 Ответ

0 голосов
/ 26 апреля 2020

Я думал об опрятном решении. Возможно, это обходной путь, но я доволен.

// Change private let spacing: CGFloat = 20 to
private var spacing = CGFloat()

// Upon loading, spacing will be initialized depending on screen width
override func viewDidLoad() {
    super.viewDidLoad()

    // Added code
    if UIScreen.main.bounds.width <= 375 {
        spacing = 16 // For the iPhone 7, 8, 11 Pro
    } else {
        spacing = 20 // For the iPhone 7+, 8+ and 11 Pro Max
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...