Ответ 1
попробуйте этот код:
- (void)viewWillAppear:(BOOL)animated
{
[yourscrollview setContentOffset:CGPointZero animated:YES];
}
У меня есть простой вид, содержащий длинный вид со многими кнопками, причем все это находится в 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
через интерфейс и еще не реализовал или не синтезировал его нигде.
попробуйте этот код:
- (void)viewWillAppear:(BOOL)animated
{
[yourscrollview setContentOffset:CGPointZero animated:YES];
}
Поведение, проявленное здесь, является ошибкой в классе 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
Во-первых, спасибо за одобренный ответ выше. Кто-то упомянул, что он больше не применим, но у меня есть прокручиваемый вид внутри ячейки таблицы, и при повторном использовании ячейки он должен быть 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)
Чтобы решить эту проблему, я использую этот код:
-(void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.scrollview scrollRectToVisible:CGRectMake(0, 0, 1, 1)
animated:NO];
}
Вы можете изменить начальную и конечную точки, вызвав scrollRectToVisible: анимированные:. Но я не уверен, исправляет ли это вашу проблему.
Используйте ниже фрагмент кода для восстановления позиции прокрутки для 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;
}