Как сделать высоту UIScrollView равной высоте содержимого?
У меня есть UIScrollView и горизонтально прокручиваемый контент. Я могу правильно настроить размер контента и т. Д., Но мне нужно разместить еще один подобный ScrollView чуть ниже первого. Итак, мне нужно сделать высоту ScrollView равной высоте его содержимого. В настоящее время я использую этот код, но он не работает. Я прикрепил скриншот с вопросом и кодом:
//setting the correct content size of scrollView (self.contentSize is already calculated)
self.imageScrollView.contentSize = self.contentSize;
//creating temporary CGRect
CGRect frame = self.imageScrollView.frame;
//Changing the height and re-assigning new frame to imageScrollView
frame.size.height = self.contentSize.height;
self.imageScrollView.frame = frame;
Посмотрите на скриншот: imageScrollView находится чуть ниже NavBar. Контент по-прежнему можно прокручивать, а размер ScrollView меньше размера контента.
1 ответ
Вы не можете установить frame
высота с использованием frame.size.height = self.contentSize.height;
Вместо этого используйте frame = CGRectMake(x, y, width, height);
Пример:
self.imageScrollView.frame = CGRectMake(self.imageScrollView.frame.origin.x, self.imageScrollView.frame.origin.y, self.imageScrollView.frame.size.width, self.contentSize.height);
И, судя по всему, я подозреваю, что размер вашего контента imageScrollView
правильно, но это скрыто вашей навигационной панелью. В этом случае я рекомендую настройку imageScrollView
начало кадра до высоты панели навигации, например:
self.imageScrollView.frame = CGRectMake(self.imageScrollView.frame.origin.x, self.navigationController.navigationBar.frame.size.height, self.imageScrollView.frame.size.width, self.contentSize.height);
Обновление № 1: Вот ссылка на отличный ответ, объясняющий, почему вы не можете установить фрейм так, как вы пытались: ios frame меняет одно свойство (например, ширина)
Таким образом, в основном вы можете редактировать одинокий CGRect
структура путем изменения одного свойства, но вы не можете обновить CGRect
таким образом, если это свойство другого объекта - в этом случае свойство frame
,
Обновление № 2: Кроме того, чтобы изменить положение элементов в вашем интерфейсе, поместите код в viewDidLayoutSubviews
, не в viewDidLoad
,
Обновление № 3: чтобы иметь код в viewDidLayoutSubviews
обрабатывается только один раз, заключите его в условное выражение, например:
bool subviewsLaidout;
- (void)viewDidLoad {
subviewsLaidout = NO;
}
- (void)viewDidLayoutSubviews {
if (!subviewsLaidout) {
self.imageScrollView.frame = CGRectMake(self.imageScrollView.frame.origin.x, self.navigationController.navigationBar.frame.size.height, self.imageScrollView.frame.size.width, self.contentSize.height);
subviewsLaidout = YES;
}
}