Как мне изменить размер UICollectionView размером 2×2 и уместить его на весь экран: Swift 3 Xcode 8

#swift #xcode #uicollectionview #swift3 #xcode8

#swift #xcode #uicollectionview #swift3 #xcode8

Вопрос:

Привет, я создаю приложение, для которого требуется сетка изображений. В качестве примера я использую сетку изображений размером 2×2 в ячейках UICollectionView. Я хотел бы знать, как я мог бы уменьшить раздражающее пространство посередине, а также сделать так, чтобы они имели одинаковую ширину и высоту, чтобы они соответствовали всему экрану. Я знаю, что могу сделать это с помощью Interface builder. Однако я хочу сделать это программно, потому что по мере развития приложения будут разные уровни и разное количество квадратов — возможно, также 10×10. Я новичок в UICollectionViews. Я ссылался на многие другие вопросы, однако большинство из них находятся в Objective C, и немногие, которые находятся в Swift, похоже, не работают с Swift 3.

Вот мой полный код:

 import UIKit

class GameViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout{

@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    collectionView.delegate = self
    collectionView.dataSource = self
let collectionViewLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    collectionViewLayout.minimumLineSpacing = 0
    collectionViewLayout.minimumInteritemSpacing = 0

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 2;
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 2
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)


    let image = cell.viewWithTag(1) as! UIImageView
    image.image = #imageLiteral(resourceName: "coffee")

    return cell;
}


func collectionView(_collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    return CGSize(width: self.collectionView.frame.size.width/2, height: self.collectionView.frame.size.height/2)
    //this method is not getting called 

}




}
  

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

введите описание изображения здесь

введите описание изображения здесь

Я надеюсь, что вы, ребята, мне поможете — это будет очень полезно… Спасибо!

Я выполнил UICollectionViewDelegateFlowLayout и вызвал sizeforitematindexpath, но это не сработало. При добавлении точки останова я понял, что метод не вызывается. Итак, что-то не так, что я здесь делаю. Также Xcode выдает мне это предупреждение — введите описание изображения здесь

Комментарии:

1. Возможно, вы захотите проверить UIStackView

Ответ №1:

Убедитесь, что:

  • Подтверждение UICollectionViewDelegateFlowLayout .
  • Ширина CollectionView = ширина экрана.
  • Минимальный интервал для ячеек равен нулю. Вы можете изменить его в построителе интерфейса (выберите CollectionView -> показать инспектор размеров -> установить минимальный интервал в 0) или путем реализации minimumInteritemSpacingForSectionAt возврата нуля.
  • Если вы хотите заполнить всю высоту экрана (я спрашиваю, потому что это не то, что указано на вашем скриншоте), высота CollectionView = высота экрана.

Наконец, реализовать sizeForItemAtIndexPath метод:

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {        
    return CGSize(width: collectionView.frame.width / 2, height: 100)
}
  

Комментарии:

1. Спасибо за ответ, но, похоже, он не работает.. Я заметил, что если я изменяю размер ячеек в interface builder, размер ячейки также изменяется при запуске приложения, но когда я пытаюсь отредактировать его в коде, соответствуя UICollectionViewDelegateFlowLayout , он, похоже, остается неизменным.

2. добавьте точку останова к методу в строке возврата, достигнута ли она?

3. Я думаю, что я понял вашу точку зрения 🙂 вы используете Swift 3, я отредактировал фрагмент кода.

4. Спасибо, что сработало… гайка теперь вопрос в том, как я могу изменить размер изображения в ячейке

5. добавив ограничения к UIImageView в построителе интерфейса. Убедитесь, что он имеет одинаковый размер ячейки, и добавьте 4 ограничения: начальное, конечное, верхнее и нижнее и установите константу для всех из них равной нулю, это автоматически позволит увеличить размер изображения. Не забудьте изменить режим содержимого по желанию. Я думаю, это все 🙂

Ответ №2:

Используйте следующий код в viewDidLoad

 let collectionViewLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        collectionViewLayout.minimumLineSpacing = 0
        collectionViewLayout.minimumInteritemSpacing = 0
        collectionViewLayout.itemSize = CGSize(width: UIScreen.main.bounds.width/2, height: UIScreen.main.bounds.width/2)
  

Ответ №3:

Используйте делегат «UICollectionViewDelegateFlowLayout» для задания размера ячейки CollectionView

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: UIScreen.main.bounds.width/2, height: UIScreen.main.bounds.width/2)
    }
  

Я надеюсь, что это будет полезно для вас.

Комментарии:

1. верните CGSize(ширина: UIScreen.main.bounds. ширина / 2, высота: UIScreen.main.bounds. width/2) сделает его квадратным в зависимости от ширины UIScreen.main.bounds .

2. Да, это сделает квадрат. Мы можем изменить размер в соответствии с требованиями.

3. Спасибо, ребята, за ваши быстрые ответы, я действительно ценю это. Однако соответствие UICollectionViewDelegateFlowLayout, похоже, не приносит никакой пользы… Я реализовал sizeForItemAtIndexPath, но при добавлении точки останова кажется, что метод не вызывается…

4. пусть collectionViewLayout = self.CollectionView.collectionViewLayout как! UICollectionViewFlowLayout collectionViewLayout.minimumLineSpacing = 0 collectionViewLayout.minimumInteritemSpacing = 0 collectionViewLayout.itemSize = CGSize(ширина: UIScreen.main.bounds. ширина / 2, высота: UIScreen.main.bounds. ширина / 2)

Ответ №4:

Вы можете использовать следующее для определения размера ячеек:

 extension GameViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let cellWidth = self.collectionView.bounds.width / 2
        return CGSize(width: cellWidth, height: cellWidth)
    }
}
  

Кроме того, добавьте следующие строки в конце viewDidLoad() , чтобы избавиться от нежелательных пробелов:

 let collectionViewLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
collectionViewLayout.minimumLineSpacing = 0
collectionViewLayout.minimumInteritemSpacing = 0
  

Комментарии:

1. Спасибо за ответ, но, похоже, соответствие UICollectionViewDelegateFlowLayout не приносит никакой пользы…

2. О, я просто поставил точку останова в sizeForItemAt indexPath и понял, что метод не вызывается! Однако я выполнил UICollectionViewDelegateFlowLayout…

3. Просто ради тестирования попробуйте удалить «слабый» из IBOutlet CollectionView.

4. Сделал это .. никакой разницы

5. Только что увидел ваше редактирование. Вы используете синтаксис swift 2. Попробуйте скопировать мой ответ :).