Как установить динамическую ширину UICollectionViewCell

Я создаю приложение для iOS и использую представление коллекции с ячейкой представления коллекции. Я уже установил ограничение представления коллекции на основное представление. но, однако, если я запускаю приложение, оно дает другой результат. Даже в версии для iPhone 5 контент перекрывал ширину экрана.

Пожалуйста, посмотрите на снимок экрана ниже

версия iPhone 5

Содержимое представления коллекции перекрывало размер экрана. Пожалуйста, сравните с версией iPhone 7 и 7plus ниже

версия iPhone 7

а это версия для айфона 7p

айфон 7р

Я уже пытался установить конкретное ограничение для верхнего, левого, нижнего, правого, но это не дало результата. Это моя раскадровка контроллера представления

раскадровка

Я искал по всему сайту, но нашел только, как установить динамическую высоту, а не ширину. Я хочу установить только динамическую ширину, потому что высота содержимого была постоянной. Может ли кто-нибудь дать мне совет?

Примечание: это код просмотра моей коллекции (может быть, кто-то захочет посмотреть)

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let screenSize: CGRect = UIScreen.main.bounds


    return CGSize(width: collectionPromo.bounds.size.width, height: collectionPromo.collectionViewLayout.collectionViewContentSize.height);
}

Я попытался установить динамическую ширину этого кода (нашел в инете)

ПРИМЕЧАНИЕ: это не проблема режима просмотра изображения, потому что тот, который перекрывается, был всем содержимым (включая метку), а не только представлением изображения, это мой код просмотра коллекции

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

    var labelPromo = cell.viewWithTag(3) as! UILabel
    labelPromo.text = list[indexPath.row].Period

    var imagePromo = cell.viewWithTag(2) as! UIImageView
    let promimg = try? UIImage(data: Data(contentsOf: URL(string: list[indexPath.row].ImageUrl)!))
    imagePromo.image = promimg!
    imagePromo.contentMode = UIViewContentMode.scaleAspectFit
    //imagePromo.layer.masksToBounds = true
    imagePromo.clipsToBounds = true


    cell.layer.masksToBounds = false
    cell.layer.borderColor = UIColor.white.cgColor
    cell.layer.borderWidth = 5.0
    //cell.layer.contentsScale = UIScreen.main.scale
    cell.layer.shadowOpacity = 0.25
    cell.layer.shadowRadius = 5.0
    cell.layer.shadowOffset = CGSize.zero
    cell.layer.shadowPath = UIBezierPath(rect: cell.bounds).cgPath
    cell.layer.shouldRasterize = true
    cell.layer.backgroundColor = UIColor.white.cgColor


    return cell
}

person christ2702    schedule 10.08.2017    source источник
comment
Каковы ограничения на просмотр изображения?   -  person meaning-matters    schedule 10.08.2017
comment
посмотрите на раскадровку (правая часть)   -  person christ2702    schedule 10.08.2017
comment
Я думаю, вы исправили ширину коллекции для iphone 7, поэтому в iphone 5 она переполняется.   -  person Phu Duy    schedule 10.08.2017
comment
@PhuDuy, как сделать его динамичным? Я просто установил верхнее, левое и правое ограничение   -  person christ2702    schedule 11.08.2017
comment
@ christ2702 вы пытаетесь изменить вид на iphone 5, я вижу ограничение, связанное с шириной вашего изображения.   -  person Phu Duy    schedule 11.08.2017


Ответы (2)


Используйте методы collectionView для установки края CollectionView. Collection View автоматически вычисляет свою динамическую ширину.

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets
{
    return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
}

Или вы можете использовать это.

Но попробуйте поместить следующий код внутрь viewDidLoad():

collectionView!.contentInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

Это добавит отступы к каждой стороне collectionView.

person Shivam Srivastava    schedule 10.08.2017

введите здесь описание изображенияВы можете добавить цвет фона для изображения. И увидеть его в соответствии аспекта. Вам нужно добавить изображения в ваше приложение, которые не находятся в портретном режиме. Также вам нужно добавить ограничения, чтобы никакие изображения не расширяли границу.

Простой совет - отладить причину, по которой он растягивается на этом конкретном устройстве? Выполните три шага 1) используйте цвет фона

2) ограничения на просмотр изображений

3) поиграйте с соотношением сторон изображения

    Try this - let IS_OS_8_OR_LATER = 
    Float(UIDevice.currentDevice().systemVersion) >= 8.0

   let IS_IPHONE = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Phone

   let IS_STANDARD_IPHONE_6 = (IS_IPHONE && 
   UIScreen.mainScreen().bounds.size.height == 667.0 && IS_OS_8_OR_LATER && 
    UIScreen.mainScreen().nativeScale == UIScreen.mainScreen().scale)

let IS_ZOOMED_IPHONE_6 = (IS_IPHONE && 
UIScreen.mainScreen().bounds.size.height == 568.0 && IS_OS_8_OR_LATER && 
 UIScreen.mainScreen().nativeScale > 
UIScreen.mainScreen().scale)

let IS_STANDARD_IPHONE_6_PLUS = (IS_IPHONE && 
UIScreen.mainScreen().bounds.size.height == 736.0 )

let IS_ZOOMED_IPHONE_6_PLUS = (IS_IPHONE && 
UIScreen.mainScreen().bounds.size.height == 667.0  && IS_OS_8_OR_LATER && 
UIScreen.mainScreen().nativeScale < UIScreen.mainScreen().scale)

if IS_ZOOMED_IPHONE_6_PLUS {
    //do something
}
person cole    schedule 10.08.2017
comment
версия iPhone 7plus, это дополнительное пространство слева и справа от ячейки просмотра коллекции - person christ2702; 10.08.2017
comment
Его простой макет проблемы с проблемой аспекта изображения. Просто попробуйте добавить еще несколько ограничений и поэкспериментируйте с заполнением и подгонкой аспектов. - person cole; 10.08.2017
comment
Обновлен мой ответ, пожалуйста, проверьте - person cole; 10.08.2017
comment
Я уже пробовал ваш совет, но он не дает другого результата. потому что UILabel под изображением также перекрывается. помните, что я использую ячейку просмотра коллекции, а не только просмотр изображения - person christ2702; 10.08.2017
comment
Я уверен, что это проблема авторазметки. Но если вы считаете, что сделали все, то последнее, я бы предложил вам этот фрагмент кода - person cole; 10.08.2017
comment
Давайте продолжим обсуждение в чате. - person cole; 10.08.2017