Проблема автомакета UIScrollview

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

Моя проблема

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

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

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

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


person Mathias Aichinger    schedule 25.09.2012    source источник
comment
Вы правильно установили размер кадра?   -  person iMeMyself    schedule 25.09.2012
comment
если вы кодируете прокрутку программно без пера, добавьте фрагмент кода к вопросу.. это может помочь вам получить лучшие ответы   -  person iMeMyself    schedule 25.09.2012
comment
Я ничего не кодирую! все было настроено в интерфейсном конструкторе   -  person Mathias Aichinger    schedule 25.09.2012
comment
установить рамку прокрутки следующим образом: CGRect scrollFrame = CGRrectMake(x, y, width, height); ScrollView.frame = scrollFrame;   -  person iMeMyself    schedule 25.09.2012
comment
Исправлена ​​эта проблема в соответствующей теме stackoverflow.com/a/18475112/318790.   -  person chebur    schedule 28.08.2013


Ответы (9)


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

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

Он сбрасывает смещение содержимого до источника, но похоже, что и другие ответы.

person user1071136    schedule 10.11.2012
comment
это работает! но когда я верну его к правильному значению (в viewdidappear), он мерцает! поэтому я продолжаю искать лучший способ.... - person Mathias Aichinger; 28.11.2012
comment
установите правильное смещение в viewDidLayoutSubviews обратно, и все в порядке :) - person Mathias Aichinger; 29.11.2012
comment
Это невероятно и досадная ошибка/проблема. Люди не готовы иметь дело с этой ошибкой при настройке в Interface Builder. - person Ethan Mick; 09.04.2013
comment
Мне также пришлось использовать это исправление, но прежде чем я представил свой UIViewController, я позволил прокрутке scrollView вверх. Мой scrollView был за пределами экрана, поэтому у меня не было мерцания. Но вы можете создать метод для сброса прокрутки в исходную точку и вызвать его примерно через 1 секунду (performSelector:withObject:afterDelay:); когда вы начинаете представлять свой UIViewController. - person Yannick; 17.09.2013
comment
Похоже, что Apple исправила эту проблему в новейшей iOS! :) - person Mathias Aichinger; 25.09.2013
comment
@ matchi1992 У меня самая последняя версия, и я столкнулся с этой проблемой. Может кто-нибудь сказать, почему это происходит? пожалуйста. - person Frade; 03.11.2014
comment
@Frade, ты нашел обходной путь? У меня Xcode 6.2 - person Beto; 28.03.2015
comment
@Beto Bens, не совсем обходной путь. Я переработал интерфейс с новыми/другими ограничениями авто-макета. Сначала у меня было много uibuttons внутри одного представления, и я пытался поместить представление в scrollView. Я убрал представление, поэтому разместил все кнопки и представления прямо на scrollView, зафиксировал одно относительно scrollView, а остальные — относительно первого. И это сработало. - person Frade; 30.03.2015

если вы все еще ищете ответ, я нашел его сегодня после двух дней стука головой о стену. Я просто вставлю вам код, но самое главное, когда вы загрузите свой 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, что имеет решающее значение для решения этой проблемы. Удачи с вашим проектом ;)

person kadore    schedule 02.11.2012

Я использовал решение Адама, но у меня начались проблемы, когда я увольнялся с помощью анимированного: ДА. В моем коде смещение контента устанавливается через некоторое время после 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;
     }];
}

РЕДАКТИРОВАТЬ: другой, лучший способ - сбросить его обратно в viewDidLayoutSubviews :)

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist))
    {
        self.scrollView.contentOffset = self.scrollOffsetToPersist;
        self.scrollOffsetToPersist = CGPointZero;
    }
}
person Kukosk    schedule 29.01.2013
comment
Обратите внимание, что если вы установите его в viewDidLayoutSubviews, вам может потребоваться также сохранить смещение в viewDidDisappear:, иначе смещение прокрутки перейдет к нулю, когда вы представите контроллер модального представления, и не будет сброшено должным образом. Я также сообщил Apple об ошибке в связи с этим поведением: openradar.appspot.com/radar?id= 3011407 - person DesignatedNerd; 22.05.2013
comment
Я решаю свою проблему, используя NSoperationQueue, используя метод viewDidLayoutSubviews и устанавливая contectsize для прокрутки. Спасибо @kukosk - person Ilesh P; 22.08.2015

Это не очень хорошо, но я превзошел автоматический макет (определенно неправильный способ, но мне надоело пытаться!), установив размер содержимого в 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;
}

Совсем не элегантно, но работает, поэтому решил поделиться.

person Adam Waite    schedule 07.12.2012
comment
Apple написала то же самое... возможно, лучшее решение на данный момент... но я думаю, что viewDidLayoutSubviews - лучшая позиция, чтобы установить смещение обратно - person Mathias Aichinger; 10.12.2012
comment
Да, это то, что сработало для меня. Простая идея, такая как изменение размера подпредставлений в представлении прокрутки, выполнение довольно сложное ... Потратил часы на возню с UIScrollView и автомакетом, прежде чем окончательно остановиться на этом. - person Michael; 18.04.2013

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

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

Проблема заключается в том, что 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;
}
person Ratha Hin    schedule 29.08.2013

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

self.automaticallyAdjustsScrollViewInsets = NO;

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

person Lukas    schedule 04.04.2014
comment
это была проблема iOS 6. в iOS 7 все нормально! - person Mathias Aichinger; 04.04.2014
comment
эта проблема вернулась в ios9 - person kemdo; 01.01.2017

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

person mimc    schedule 19.02.2013

попробуй это

@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;
}
person Jimvanced    schedule 28.07.2014