Проблема автозапуска 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;
}