Высота изображений не работает при программной настройке

#ios #swift

#iOS #swift

Вопрос:

Я устанавливаю высоту для своих изображений программно. Но это работает должным образом только на iPhone SE. Но не, например, на iPhone X.

Вот скриншоты:

введите описание изображения здесь

введите описание изображения здесь

Теперь давайте взглянем на мой код. Как вы можете видеть, я программно устанавливаю положение x и y для изображений. Кроме того, высота и ширина.

 let kint = skrolas.frame.height // Here's my scrollView frame

    vienas.frame = CGRect(x: 8, y: 17, width: screenWidth-42, height: kint) // Here I set my first image programatically. I want height to be the same like my scrollView height.


    let dydis2 = vienas.frame // Here's my first picture frame

    du.frame = CGRect(x: (dydis2.origin.x (screenWidth-42) 8), y: 17, width: screenWidth-42, height: kint) // Here's my second picture


    let dydis3: CGRect = du.frame
    trys.frame = CGRect(x: (dydis3.origin.x (screenWidth-42) 8), y: 17, width: screenWidth-42, height: kint) // And thirt picture
  

Итак, как вы видите, моя ширина работает должным образом. Но мой рост не работает. И я не понимаю, почему. Как я упоминал в своем коде, я установил высоту своих изображений такой же, как в ScrollView.

Мой ScrollView выглядит следующим образом на iPhone XS: введите описание изображения здесь

Вот ссылка на мой проект: DropBox

 @IBOutlet weak var skrolas: UIScrollView!
public var screenWidth: CGFloat {
    return UIScreen.main.bounds.width
}
public var screenHeight: CGFloat {
    return UIScreen.main.bounds.height
}
  

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

1. Почему вы не используете Autolayout ? И где вызывается ваш код, который устанавливает рамки?

2. если вы хотите показать несколько изображений с функцией прокрутки, используйте для этого представление коллекции.

3. Вы устанавливаете рамки просмотра изображений в viewDidLoad() ?

4. @DonMag Да, я настраиваю viewDidLoad().

5. @DonMag Кроме того, я назначил ссылку на свой проект.

Ответ №1:

Проблема 1. Вы должны использовать ограничения автоматической компоновки вместо явной настройки рамок.

Проблема 2. Вы устанавливаете размеры фрейма, в viewDidLoad() котором раньше выполнялся какой-либо макет, поэтому у вас нет доступа к фактической ширине и высоте экрана.

Проблема 3: У вас есть опция «Загрузить другую фотографию», поэтому я предполагаю, что в конечном итоге вы захотите показать много фотографий. Используя ваш подход, вы быстро столкнетесь с проблемами с памятью.

Вероятно, вам следует подумать об использовании UICollectionView . Это дало бы вам «автоматическую» горизонтальную прокрутку и позволило бы использовать память намного эффективнее — вы могли бы прокручивать множество изображений без проблем.

Однако первый шаг, чтобы увидеть проблему с размером, — это переместить свой код определения размера из viewDidLoad() в viewDidLayoutSubviews() , и вы получите правильные значения размера.

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

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