Подтвердить что ты не робот

Интервал между ячейками UICollectionView на основе размера экрана устройства

Я реализовал UICollectionView, размер ячейки w90 h90. Когда я запускаю его на iPhone 6, я получаю правильный интервал между ячейками, но когда я делаю это на iPhone 5, я получаю больше интервала между ячейками. Мой вопрос: как изменить размер ячейки на основе размера экрана устройства, предположим, что если размер ячейки был w80 h80, я получаю правильные результаты и на iPhone 5s. что я сейчас делаю,

 override func viewWillAppear(animated: Bool) {

        var scale = UIScreen.mainScreen().scale as CGFloat
        println("Scale :\(scale)")

        var cellSize = (self.collectionViewLayout as UICollectionViewFlowLayout).itemSize
        println("Cell size :\(cellSize)")

        imageSize = CGSizeMake(cellSize.width * scale , cellSize.height * scale)
        println("Image size : \(imageSize)")

    }

//sizeForItemAtIndexPath

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

        return imageSize!

   }

Результат на iPhone 6: enter image description here

Результат на iPhone 5s enter image description here

Objective-C/Swift оба отлично подходят для решения. Спасибо.

4b9b3361

Ответ 1

Шаг 1: Внедрение UICollectionViewDelegateFlowLayout (если не выполнено).

Шаг 2: Используйте метод делегата UICollectionViewDelegateFlowLayout.

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/4,120); //use height whatever you wants.
}

Шаг 3: Перейдите в XIB или StoryBoard, где у вас есть CollectionView.

Шаг 4: В XIB или StoryBoard, где у вас есть CollectionView, нажмите на CollectionView.

Шаг 5: Перейдите в InterfaceBuilder, а затем во второй последней вкладке (например, Size Inspector) установите Min Spacing

Для ячеек = 5

Для строк = 5

Что это.

Примечание:

  • Это решение, если вы хотите сделать интервал между ячейкой = 5.
  • Если ваш интервал отличается от 5, вам нужно изменить значение 15 в методе делегата.
  • Пример: Интервал между ячейками = 10, затем измените делегат 15 на 10x3 = 30

return CGSizeMake((UIScreen.mainScreen().bounds.width-30)/4,120);

  • И установите Min Spacing

For Cells = 10

For Lines = 10

и наоборот.

версия Swift 3

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = UIScreen.main.bounds.width
    return CGSize(width: (width - 10)/3, height: (width - 10)/3) // width & height are the same to make a square cell
}

Ответ 2

Для более гибкого ответа

Позволяет настраивать количество столбцов и интервалов, расширяя ответ Zaid Pathan

// MARK: UICollectionViewDelegateFlowLayout delegate method
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
    let cellSpacing = CGFloat(2) //Define the space between each cell
    let leftRightMargin = CGFloat(20) //If defined in Interface Builder for "Section Insets"
    let numColumns = CGFloat(3) //The total number of columns you want

    let totalCellSpace = cellSpacing * (numColumns - 1)
    let screenWidth = UIScreen.mainScreen().bounds.width
    let width = (screenWidth - leftRightMargin - totalCellSpace) / numColumns
    let height = CGFloat(110) //whatever height you want

    return CGSizeMake(width, height);
}

Ответ 3

Objective-c пример:

используйте эту функцию

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
     return CGSizeMake(Your desired width, Your desired height);    
    // example: return CGSizeMake(self.view.frame.size.width-20, 100.f);
}

Ответ 4

I wanted 3 item in a section in Both IPad and iPhone. I worked out using the following code. Hope it helps!

1 ) Implement UICollectionViewDelegateFlowLayout delegate


2 )  var device = UIDevice.currentDevice().model

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
    {
        if (device == "iPad" || device == "iPad Simulator")
        {
            return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/3,230)
        }
        return CGSizeMake((UIScreen.mainScreen().bounds.width-10)/3,120)
    }

Ответ 5

Чтобы развернуть ответ Тима, есть небольшая оговорка, касающаяся частичной ширины точек: округление ширины частичной точки может привести к тому, что ширина будет шире, чем позволяет количество желаемых столбцов. Один из способов обойти это - обрезать ширину с помощью trunc():

 return CGSizeMake(trunc(width), height)