iPhone ScrollView в контроллере панели вкладок — ScrollView не прокручивается. Кто-нибудь может помочь?

#objective-c #cocoa-touch

#objective-c #cocoa-touch

Вопрос:

Я пытаюсь добавить ScrollView к контроллеру панели вкладок. Проблема в том, что ScrollView не прокручивается, и я ни за что на свете не смогу выяснить почему в Google. Если я заменю ScrollView на TextView, он прокручивается, как и TableView.

Вы можете получить код, демонстрирующий это, отсюда: git://gitorious.org/scrollview-in-tabbar-project/scrollview-in-tabbar-project.git

Кто-нибудь может сказать мне, что я делаю не так? Пожалуйста, обратите внимание, что, к сожалению, TextView, который находится внутри ScrollView, прокручивается. Не уверен, связано ли это, но я не получаю вызов viewWillAppear при выборе вкладки ScrollView.

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

1. Действительно ли размер содержимого в вашем scrollview больше границ самого scrollview? если нет; scrollview не будет прокручиваться (потому что это не обязательно).

2. Как мне это выяснить? Визуально содержимое больше, чем ScrollView, но я не знаю, как подтвердить это в коде. Вот почему я разместил исходники на gitorious: надеясь, что кто-нибудь взглянет на это и предложит мне прямое решение и просветит меня.

3. developer.apple.com/library/ios/#documentation/uikit/reference/…

4. Я не хочу проявить неуважение, но я уже просмотрел документы и Google, и я разместил этот вопрос здесь, потому что у меня закончились идеи. Я опубликовал самый простой проект, который смог придумать, надеясь получить простой и прямой ответ после RTFM-редактирования, но ничего не добился. Я искусственно увеличил содержимое, чтобы оно не помещалось на экране ни на одно поле, и я все еще не могу прокручивать ScrollView. Мое предположение заключается в том, что сам ScrollView не станет больше экрана.

5. Я намекнул на документы, потому что вы спросили о contentSize; который там есть. Я не знаю, как получить ваш проект Git, так как у меня нет опыта работы с Git, поэтому я не могу взглянуть на сам код.

Ответ №1:

Вы не установили contentSize свой scrollview. Вы несете ответственность за установку contentSize свойства. В вашем случае вы можете добавить это в viewDidLoad в свой SecondViewController :

 -(void)viewDidLoad {
    [super viewDidLoad];
    UIScrollView *scrollView = (UIScrollView *)self.view;
    scrollView.contentSize = CGSizeMake(self.view.frame.size.width, 1024);
}
  

Установите высоту contentSize такой, которая соответствует вашим потребностям (возможно, вам нужно рассчитать высоту, чтобы соответствовать тому, что вы помещаете в scrollview).

Вот пример из документации Apple: Создание видов прокрутки в Interface Builder

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

1. Эй, это заставило его прокручиваться! Приветствия! По какой-то причине я ожидал, что он обнаружит это сам по себе.

2. @MiRAGe Да, именно поэтому я проголосовал за твой первый комментарий. Все мои поиски в Google приводили к похожим предложениям, но я ошибся по разным причинам: я не нашел нужных справочных страниц (Эрик указал на страницу, которую я не видел, где сразу говорится, что я несу ответственность за эту настройку), viewWillAppear не выдается (и, думая, что я делаю что-то не так, я не стал пробовать viewDidLoad). Я хотел получить быстрый и по существу ответ, поскольку я явно не понимал, что мне нужно было делать.

Ответ №2:

Основываясь на ответе Эрика Тьернлунда, мой код теперь выглядит следующим образом:

 - (void) viewDidLoad
{
    [super viewDidLoad];

    CGFloat maxDepth = 0;

    for (int i = 0; i < scrollView.subviews.count; i  )
    {
        UIView *aSubview = (UIView *) [scrollView.subviews objectAtIndex:i];
        CGFloat depth = aSubview.frame.origin.y   aSubview.frame.size.height;
        if (depth > maxDepth)
            maxDepth = depth;
    }
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, maxDepth);
}
  

и прямо сейчас похоже, что это удовлетворяет мои потребности. Это также, вероятно, не на 100% правильно, и я выясню это по мере углубления.