31

我的自动布局(可能)和我的滚动视图有问题!

我的问题

  1. 我向下滚动 看法

2.然后我推送到另一个视图

3.然后我回去,滚动视图看起来像那样,我无法滚动到最高点。(我在滚动视图的弹跳中看到它) 滚动视图

有谁能够帮我?

4

9 回答 9

40

包含视图控制器中的以下代码片段似乎也解决了这个问题,而不依赖于显式大小:

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

它确实将内容偏移量重置为原点,但其他答案似乎也是如此。

于 2012-11-10T21:36:25.253 回答
11

如果您仍在寻找答案,我今天在头撞墙上两天后找到了答案。我只是将代码粘贴给您,但最重要的是当您加载滚动视图时..

    -(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,这对于解决此问题至关重要。祝你的项目好运;)

于 2012-11-02T14:10:48.423 回答
6

我正在使用亚当的解决方案,但是当我用动画解散时开始遇到问题:YES。在我的代码中,内容偏移量在 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;
    }
}
于 2013-01-29T18:45:48.873 回答
3

这不是很好,但我通过在自动布局发生后在 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;
}

一点也不优雅,但我想我会分享的作品。

于 2012-12-07T07:39:53.353 回答
1

问题原因 ScrollView 在应用 AutoLayout 之前设置了 ContentOffset。解决方案是:

创建私有财产

@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;
}
于 2013-08-29T10:16:18.850 回答
1

我使用 UITabBarController 和具有自动布局的不同视图。视图比设备的屏幕长。从一个选项卡切换到另一个选项卡有时会导致您描述的问题。仅当视图在切换之前向下滚动时才会发生这种情况。我在这里尝试了所有建议,但这对我的情况不起作用。我的解决方案是在离开视图之前再次向上滚动。至少在 iOS 6 中解决这个错误:

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [scrollView setContentOffset:CGPointZero animated:NO];
}
于 2013-08-05T22:45:11.127 回答
1

你试过这个吗?

self.automaticallyAdjustsScrollViewInsets = NO;

就我而言,这就是解决我的问题的原因。

于 2014-04-04T12:05:06.120 回答
0

我有同样的问题。结果我在内容视图上设置了一个约束,将它的 y 中心与超级视图的 y 中心对齐。当我删除这个约束时,它工作得很好。

于 2013-02-19T22:06:20.367 回答
0

尝试这个

@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;
}
于 2014-07-28T09:18:00.517 回答