Как сделать высоту 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 меньше размера контента.Кадр 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;
    }
}
Другие вопросы по тегам