Проблема автозапуска UIScrollview

У меня проблема с автозапуском (возможно) и моим scrollview!

Моя проблема

  • Я прокручиваю вниз View

2. Затем я нажимаю на другой вид

3. Затем я возвращаюсь назад, и scrollview выглядит так, и я не могу прокрутить до самой высокой точки (я вижу это в подпрыгивании scrollview) Scrollview

Может кто-нибудь мне помочь?

Ответ 1

Следующий фрагмент кода в содержащем контроллере представления также, похоже, решает проблему, не полагаясь на явные размеры:

- (void)viewDidDisappear:(BOOL)animated {
  [super viewDidDisappear:animated];
  self.mainScrollView.contentOffset = CGPointZero;
}

Это reset смещение содержимого к началу координат, но, похоже, так же делают и другие ответы.

Ответ 2

если вы все еще ищете ответ, который я нашел сегодня, после двух дней перебора стены. Я просто вставлю вам код, но самое главное, когда вы загружаете свой scrollView..

    -(void)viewWillAppear:(BOOL)animated{

    [scrollView setFrame:CGRectMake(0, 0, 320, 800)];
}

-(void)viewDidAppear:(BOOL)animated
{
    [scrollView setScrollEnabled:YES];
    [scrollView setContentSize:CGSizeMake(320, 800)];

}

все это загружается до -(void)viewDidLoad

Обратите внимание, что высота указана в обоих случаях 800, что имеет решающее значение для решения этой проблемы. удачи в вашем проекте;)

Ответ 3

Я использовал решение adam, но у меня возникли проблемы, когда я увольнялся с анимированным: ДА. В моем коде смещение содержимого устанавливается через некоторое время после viewWillAppear (поскольку viewWillAppear появляется слишком рано).

- (void)viewDidDisappear:(BOOL)animated
{
    self.scrollOffsetToPersist = self.scrollView.contentOffset;
    self.scrollView.contentOffset = CGPointZero;

    [super viewDidDisappear:animated];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSOperationQueue mainQueue] addOperationWithBlock:^
     {
         self.scrollView.contentOffset = self.scrollOffsetToPersist;
     }];
}

EDIT: другой, лучший способ reset вернуть его в viewDidLayoutSubviews:)

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist))
    {
        self.scrollView.contentOffset = self.scrollOffsetToPersist;
        self.scrollOffsetToPersist = CGPointZero;
    }
}

Ответ 4

Это не очень хорошо, но я бил автоматическую компоновку (определенно не правильный путь, но мне было надоело пытаться!), установив размер содержимого в viewDidAppear после того, как произойдет автоматическое отключение, установив scrollOffset и сохранив смещение прокрутки в viewDidDisappear, а затем установите смещение прокрутки обратно в это состояние в viewDidAppear.

Вот так:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:YES];
    self.scrollView.contentSize = self.scrollViewInnerView.frame.size;
    self.scrollView.contentOffset = [self.scrollOffsetToPersist CGPointValue];

}

-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:YES];
    self.scrollOffsetToPersist = [NSValue valueWithCGPoint:self.scrollView.contentOffset];
    self.scrollView.contentOffset = CGPointZero;
}

Совсем не изящно, но работает так, что я бы поделился.

Ответ 5

Я использую UITabBarController и различные представления с автоматическим расположением. Представления длиннее экрана устройства. Переключение с одной вкладки на другую приводит иногда к проблеме, которую вы описываете. Это произошло только в том случае, если представление было прокручено до переключения. Я пробовал все советы здесь, но это не помогло мне. Мое решение состояло в том, чтобы прокручивать вверх, прежде чем покинуть представление. По крайней мере, работа вокруг этой ошибки в iOS 6:

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [scrollView setContentOffset:CGPointZero animated:NO];
}

Ответ 6

Проблема вызвала, что ScrollView был установлен ContentOffset перед применением AutoLayout. решение:

Создать частную собственность

@property (assign,nonatomic) CGPoint scrollviewContentOffsetChange;

Добавить код для просмотра метода

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  self.scrollView.contentOffset = CGPointZero;
}

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  self.scrollviewContentOffsetChange = self.scrollView.contentOffset;
}

- (void)viewDidLayoutSubviews {
  [super viewDidLayoutSubviews];

  self.scrollView.contentOffset = self.scrollviewContentOffsetChange;
}

Ответ 7

Вы пробовали это?

self.automaticallyAdjustsScrollViewInsets = NO;

В моем случае именно это и решило мою проблему.

Ответ 8

У меня была та же проблема. Оказалось, что я устанавливаю ограничение на представление содержимого, выравнивающее его y-центр с y-центром супервизора. Когда я удалил это ограничение, он работал нормально.

Ответ 9

попробуйте это

@property (nonatomic, assign) CGPoint scrollViewContentOffsetChange;

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.scrollView.contentOffset = CGPointZero;
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.scrollViewContentOffsetChange = _scrollView.contentOffset;
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    _scrollView.contentOffset = self.scrollViewContentOffsetChange;
}