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

Различные размеры ячейки в UICollectionview

В моем приложении iphone я показываю изображения в виде коллекции. Я получаю изображения из URL-адресов, с URL-адресами я также получаю размер изображения. например: - скажем, есть два вида изображений: пейзаж и портрет. Я получаю значение P для портретных изображений и L для пейзажных изображений

Как настроить размер ячейки collectionView?

4b9b3361

Ответ 1

Используйте этот метод UICollectionViewDelegateFlowLayout

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

Ответ 2

1) Вы можете поддерживать и заменять несколько объектов макета, но там более простой способ. Просто добавьте следующее в подкласс UICollectionViewController и отрегулируйте размеры по мере необходимости:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{    
    // Adjust cell size for orientation
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
        return CGSizeMake(170.f, 170.f);
    }
    return CGSizeMake(192.f, 192.f);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.collectionView performBatchUpdates:nil completion:nil];
}

Вызов -performBatchUpdates:completion: приведет к недействительности макета и изменению размеров ячеек с помощью анимации (вы можете просто передать nil для обоих параметров блока, если у вас нет дополнительных настроек для выполнения).

2) Вместо жесткого кодирования размеров элементов в -collectionView:layout:sizeForItemAtIndexPath просто разделите высоту или ширину границ collectionView на количество ячеек, которые вы хотите поместить на экран. Используйте высоту, если ваш UICollectionView прокручивает по горизонтали или по ширине, если она прокручивается вертикально.

Ответ 3

Это то, что я сделал. Сначала я устанавливаю размер ячейки в зависимости от размера экрана (чтобы мы могли получить наилучшее количество изображений в каждой строке). Вы можете изменить номера в соответствии с вашими соображениями.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGFloat widthOfCell =(self.view.frame.size.width-30)/2;
CGFloat heightOfCell =widthOfCell * 1.33;
CGSize returnValue = CGSizeMake(widthOfCell, heightOfCell);
returnValue.height += 5; 
returnValue.width += 5; 
return returnValue;

}

Затем я использовал метод манипуляции изображениями, чтобы определить пейзаж или портретное состояние, и (для моего приложения) я решил сделать каждое изображение портретом:

    if (sourceImage.size.width>sourceImage.size.height) {
    sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage
                                             scale: 1.0
                                       orientation: UIImageOrientationRight];
    }

Если вы хотите иметь его наоборот, замените > на <

CAVEAT: мой метод вращения не учитывается, если изображение указывает влево или вправо. Другими словами, если изображение имеет пейзаж вверх дном, мой код не может распознать это. Я надеюсь, что кто-то еще может вам помочь, и я надеюсь, что я не ушел с пути!:)

Ответ 4

Чтобы быстро увеличить расписание потока до вашего viewcontroller, если вам нужно показать динамические изображения в переменной make ячейки, которые содержат имя изображения в вашем contorller представления и используют это:

let imageData = ["image1","image2","image3","image4"]

extension yourViewController: UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{
  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let photo = UIImage(named: imageData[indexPath.row])
        return CGSize(width: (photo?.size.width)!, height: (photo?.size.height)!)

}

}