#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. Попробуйте скопировать мой ответ :).