Пользовательский xib внутри другого xib не правильно определен - PullRequest
2 голосов
/ 17 февраля 2020

Для начала, вот иерархия моих представлений:

- Table view
-- Table view cell (loaded from custom xib)
--- Collection view
---- Collection view cell (loaded from custom xib)
----- Custom view (loaded from custom xib)

У меня проблемы с тем, что это последнее представление, пользовательское представление, которое я загружаю в ячейку представления коллекции как пользовательский хиб. По какой-то причине он не имеет правильного размера:

enter image description here

Как вы можете видеть, над панелью вместо гигантского белого пространства вместо правильно заполнив ячейку. Как ни странно, если я прокручиваю вниз представление таблицы, а затем прокручиваю назад вверх, он отображает следующее:

enter image description here

Вот часть код представления моей коллекции:

// I use this to size the collection view cells to be of 16:9 ratio, nothing crazy
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    // Get the width of the screen
    let width = UIScreen.main.bounds.width

    let imageWidth = width
    let imageHeight = imageWidth / (16 / 9)

    self.postMediaHeight = imageHeight

    return CGSize(width: imageWidth, height: imageHeight)
}

// Here I initialize the cell
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PostMediaCollectionViewCell", for: indexPath as IndexPath) as? PostMediaCollectionViewCell else {
        fatalError("The dequeued cell is not an instance of PostMediaCollectionViewCell.")
    }

    let media = post.images[indexPath.row]

    cell.initialize()

    return cell
}

Вот класс ячеек представления моей коллекции, PostMediaCollectionViewCell. Ничего необычного:

class PostMediaCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var container: UIView!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var moreView: UIView!
    @IBOutlet weak var moreViewLabel: UILabel!
    @IBOutlet weak var myCustomView: MyCustomView!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    func initialize() {
        //
    }
}

И, наконец, вот мой класс для MyCustomView:

class MyCustomView: UIView {
    @IBOutlet var rootView: UIView!
    @IBOutlet weak var videoView: VideoView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initialize()
    }

    func initialize() {
        Bundle.main.loadNibNamed("MyCustomView", owner: self, options: nil)
        addSubview(rootView)
        rootView.frame = self.bounds
        rootView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }
}

Я убедился, что мои ограничения установлены прямо в моем xibs, так что авто макет должен работать, но это явно не так:

PostMediaCollectionViewCell xib: https://i.stack.imgur.com/GQLpj.png

MyCustomView xib: https://i.stack.imgur.com/jpSi0.png

Так что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Так что я нашел решение для этого, но я не знаю, почему оно работает и является ли это лучшим способом его решения, поэтому я ищу ввод.

Если я изменю свой PostMediaCollectionViewCell класс для включения layoutIfNeeded() в функцию инициализации, он работает:

class PostMediaCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var container: UIView!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var moreView: UIView!
    @IBOutlet weak var moreViewLabel: UILabel!
    @IBOutlet weak var myCustomView: MyCustomView!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    func initialize() {
        layoutIfNeeded()
    }
}

Но я не понимаю, почему. Может кто-нибудь объяснить?

0 голосов
/ 17 февраля 2020

Добавьте точку останова в строке rootView.frame = self.bounds и проверьте значения self.bounds. Если значение отличается от значения после прокрутки, вам следует изменить метод awakeFromNib.

lass PostMediaCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var container: UIView!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var moreView: UIView!
@IBOutlet weak var moreViewLabel: UILabel!
@IBOutlet weak var myCustomView: MyCustomView!

override func awakeFromNib() {
    super.awakeFromNib()

    self.myCustomView.frame = self.bounds 
    self.myCustomView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

}

func initialize() {
    //
}

}

...