Сделайте так, чтобы высота UICollectionViewCell соответствовала его содержимому (суммарная высота всех вложенных представлений) с помощью AutoLayout - PullRequest
0 голосов
/ 14 апреля 2019

Я нашел следующий ответ, чтобы высота UIView соответствовала его содержимому https://stackoverflow.com/a/39527226/7767664

Я проверил его, он работает нормально (если размер высоты UIView в раскадровке больше или меньше его содержимого, то во время выполненияон автоматически изменяет размер, чтобы соответствовать содержимому).

Но если я использую UICollectionViewCell вместо UIView, то ничего не меняется, высота ячейки никогда не изменяется, она всегда имеет жестко заданную высоту, которая есть в свойствах раскадровки:

enter image description here

Что еще я могу сделать?

Также у меня есть 2 раздела в UIControllerView (2 столбца).Две ячейки в одной строке должны иметь одинаковый размер, даже если их размер содержимого различен (что-то вроде этого реализовано в Android изначально при использовании RecyclerView с GridLayoutManager, очень просто)

Обновление

Он работает с UIView, потому что я установил для его верхнего ограничения значение Safe Are'a top

Я не могу сделать это с UICollectionViewCell

Обновление 2

Кажется, у меня есть некоторый прогресс в этом ответе https://stackoverflow.com/a/25896386/7767664

Но вместо newFrame.size.width = CGFloat(ceilf(Float(size.width))) мне нужно newFrame.size.height = CGFloat(ceilf(Float(size.height)))

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

С этим решением я не смогу использовать какие-либо поля, иначе некоторая часть станет невидимой в нижней части ячейки

Я думаю, этоможно решить с помощью этого вопроса https://stackoverflow.com/a/31279726/7767664

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я решил свою проблему благодаря https://stackoverflow.com/a/25896386/7767664 и https://stackoverflow.com/a/31279726/7767664

Я решил поместить один UIView со всеми необходимыми дочерними представлениями внутри него в UICollecitonViewCell

Я установил UIView трейлинг, ведущий, верхний на ICollecitonViewCell, но я не установил нижний вид на ячейку (вы должны использовать последний дочерний вид внутри UIView и соединять их днища, а не с видом на ячейку)

Затем я добавил ссылку на UIView в свой пользовательский класс ячеек и использую его высоту для высоты ячейки:

public class MyCustomItemCell: UICollectionViewCell {

    // other child views references ...

    @IBOutlet weak var wrapperView: UIView! // view which contains your other views

    //forces the system to do one layout pass
    var isHeightCalculated: Bool = false

    override public func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        //Exhibit A - We need to cache our calculation to prevent a crash.
        if !isHeightCalculated {
            setNeedsLayout()
            layoutIfNeeded()
            var newFrame = layoutAttributes.frame
            newFrame.size.height = wrapperView.frame.height // use height of our UIView
            layoutAttributes.frame = newFrame
            isHeightCalculated = true
        }
        return layoutAttributes
    }
}
0 голосов
/ 14 апреля 2019

Вы можете попробовать эту функцию, вызываемую внутри расширения CollectionView или внутри собственного класса collectionViewController:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
    {
        //return something like the size. I write you an example how to use it.
        // You can easily change the value according to your stuff contents height.

        return CGSize(width: collectionView.frame.size.width/3, height: 100)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...