Swift: высота UIStackView всегда равна 0, несмотря на добавление элементов

#ios #swift #uiimageview #tvos #uistackview

#iOS #swift #uiimageview #tvos #uistackview

Вопрос:

У меня есть это представление стека, оно содержит один ImageView:
введите описание изображения здесь если я печатаю его высоту, я всегда получаю 0:

   print("movieDetailsStackView!.bounds.height: ",movieDetailsStackView!.bounds.height ) // 0
    print("movieDetailsStackView!.frame.height: ",movieDetailsStackView!.frame.height ) // 0
  

Вот как это создается:

 func createMovieDetailsStackView () {
    /******************/
    // Add movie image
    /*****************/
    let movieImageViewHeight = 300.00
    let movieImageViewWidth = 20.00
    movieImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: movieImageViewWidth, height: movieImageViewHeight));
    movieImageView!.layer.borderWidth = 10
    movieImageView!.layer.borderColor = UIColor.red.cgColor
    /******************/
    var arrangedSubviews = [UIView]()
    arrangedSubviews.append(movieImageView!)
    
    movieDetailsStackView = UIStackView(arrangedSubviews: arrangedSubviews)
    
    movieDetailsStackView!.translatesAutoresizingMaskIntoConstraints = false
    movieDetailsStackView!.distribution = .fillProportionally
    movieDetailsStackView!.axis = .horizontal
    movieDetailsStackView!.spacing = 8

    self.view.addSubview(movieDetailsStackView!)

    movieDetailsStackView!.topAnchor.constraint(equalTo: self.view.topAnchor, constant:70).isActive = true
    movieDetailsStackView!.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0).isActive = true
    movieDetailsStackView!.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0).isActive = true
    
}
  

Есть ли какое-либо объяснение этому?

Комментарии:

1. Вы также пытались добавить ограничение высоты в представление стека? тот, который равен movieImageViewHeight

Ответ №1:

Когда вы добавляете какое-либо представление в качестве arrangedSubview представления стека, его .translatesAutoresizingMaskIntoConstraints свойству автоматически присваивается значение `false.

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

У вас есть некоторые странные настройки в коде, который вы показали, например:

  • let movieImageViewWidth = 20.00 … вы действительно хотите, чтобы он был шириной всего 20 пунктов?
  • movieDetailsStackView!.distribution = .fillProportionally … это почти наверняка НЕ то, что вы хотите для распространения. Начните с .fill и измените это только в том случае, если вы не получаете желаемого результата.
  • вы используете много ! … «принудительное разворачивание» — это путь к сбоям.

Однако с вашим существующим кодом добавьте эту строку:

 movieDetailsStackView = UIStackView(arrangedSubviews: arrangedSubviews)

// add this line here
movieImageView?.heightAnchor.constraint(equalToConstant: CGFloat(movieImageViewHeight)).isActive = true
  

и посмотрите, получите ли вы желаемый результат.