Подтвердить что ты не робот

Как reset моя позиция UIScrollView после возвращения из модального перехода?

У меня есть простой вид, содержащий длинный вид со многими кнопками, причем все это находится в UIScrollView. scroller работает хорошо, и я могу scroll снизу и нажмите a button. Каждый button запускает модальный seque to другой view. Затем новый view отклоняется путем взаимодействия пользователя, в результате чего исходный UIScrollView view загружается снова.

Здесь проблема: если я нажимаю кнопку в верхней части UIScrollView, я ввожу модальный segue, увольняю новый view и возвращаюсь к UIScrollView view без проблем. Но, если я нажму на одну из кнопок в нижней части UIScrollView, когда я вернусь seque, а затем перейдя обратно, моя прокрутка будет испорчена. Я могу видеть только область ниже моего scroller и больше не могу scroll вернуться наверх!

Я уверен, что должен быть какой-то способ reset начальных и конечных точек UIScrollView's на ViewWillAppear, но я не могу понять это. Любая помощь приветствуется!

Кроме того, FYI, я просто добавил конструктор UIScrollView через интерфейс и еще не реализовал или не синтезировал его нигде.

4b9b3361

Ответ 1

попробуйте этот код:

- (void)viewWillAppear:(BOOL)animated
{
  [yourscrollview setContentOffset:CGPointZero animated:YES];
}

Ответ 2

Обратите внимание: ошибка в этом вопросе и ответе кажется исправленной в iOS 7. Остальная часть этого ответа относится только к iOS 6 (и, возможно, ранее).

Поведение, проявленное здесь, является ошибкой в ​​классе UIScrollView. Как отмечал OP, после возвращения из модально представленного UIViewController в сцену, содержащую UIScrollView, UIScrollView берет любую точку, в которую он сейчас прокручивается, и начинает вести себя так, как если бы это было его начало. Это означает, что если бы вы прокрутили прокрутку до того, как модально представили другой контроллер просмотра, вы не сможете прокручивать резервную копию при возврате на сцену с видом прокрутки.

То же самое происходит, когда вы удаляете вид прокрутки из иерархии представления и повторно добавляете его, даже не меняя его.

Вы можете обойти это, установив contentOffset списка прокрутки назад на {0,0}, прежде чем снова отобразится после отклонения модального контроллера просмотра. Если вы действительно хотите сохранить точку, к которой просканировал пользователь, прежде чем они активировали модальный, то после повторного отображения UIScrollView вы можете установить contentOffset обратно в то, что было до вас reset.

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

@interface NonBuggedScrollView : UIScrollView

@end

@implementation NonBuggedScrollView {
    CGPoint oldOffset;
}

-(void)willMoveToWindow:(UIWindow *)newWindow {
    oldOffset = self.contentOffset;
    self.contentOffset = CGPointMake(0,0);
}

-(void)willMoveToSuperview:(UIView *)newSuperview {
    oldOffset = self.contentOffset;
    self.contentOffset = CGPointMake(0,0);
}

-(void)didMoveToWindow {
    self.contentOffset = oldOffset;
}

-(void)didMoveToSuperview {
    self.contentOffset = oldOffset;
}

@end

Если вы предпочитаете делать это в UIViewController, чем в подклассе UIScrollView, измените смещение содержимого в методах viewWillAppear: и viewDidAppear.

Если вы не хотите сохранять, где пользовательская позиция прокрутки, когда они возвращаются из модального, и просто хотите прокрутить UIScrollView назад, сверху, как запросил OP, тогда вам нужно только четное проще:

@interface NonBuggedScrollView : UIScrollView

@end

@implementation NonBuggedScrollView

-(void)willMoveToWindow:(UIWindow *)newWindow {
    self.contentOffset = CGPointMake(0,0);
}

-(void)willMoveToSuperview:(UIView *)newSuperview {
    self.contentOffset = CGPointMake(0,0);
}


@end

Ответ 3

Во-первых, спасибо за одобренный ответ выше. Кто-то упомянул, что он больше не применим, но у меня есть прокручиваемый вид внутри ячейки таблицы, и при повторном использовании ячейки он должен быть reset.

Вот решение в Swift.

@IBOutlet var scrollView: UIScrollView!

// many lines of code later inside a function of some sort...

scrollView.setContentOffset(CGPointMake(0.0, 0.0), animated: false)

Ответ 4

Чтобы решить эту проблему, я использую этот код:

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

    [self.scrollview scrollRectToVisible:CGRectMake(0, 0, 1, 1)
                                animated:NO];   
}

Ответ 5

Вы можете изменить начальную и конечную точки, вызвав scrollRectToVisible: анимированные:. Но я не уверен, исправляет ли это вашу проблему.

Ответ 6

Используйте ниже фрагмент кода для восстановления позиции прокрутки для UIScrollview

Объявить переменную "scrollPosition" как тип CGPoint.

- (void)viewDidDisappear:(BOOL)animated 
{
    [super viewDidDisappear:animated];
    //get the current offset
    scrollPosition = scrollView.contentOffset;

    //set current view to the beginning point
    self.scrollView.contentOffset = CGPointZero;
}

- (void)viewDidLayoutSubviews 
{
    [super viewDidLayoutSubviews];
    //retrieve the previous offset
    self.scrollView.contentOffset = scrollPosition;
}