在 UINavigationController 的 push 和 pop 后,UIScrollView 内容会跳动

5
所以我在我的iPad应用程序中有一个具有单个子视图(它本身是父级所有控件的父级)的UIScrollView。在此上面滚动都正常工作。旋转也正常工作(整个视图以纵向显示,横屏时滚动)。但是一旦在UINavigationController上推送了一个新屏幕,然后再返回,就会出现问题。
看起来好像滚动视图的子视图框架相对于滚动位置已经向上移动,但是滚动视图仍然保持在底部(整个子视图已经向上移动)。
我已经尝试花费数小时在故事板中与约束进行斗争,但无法确定是什么原因导致了这个问题。
如下图:“How it starts”为开始状态,“How it looks like after navigating and returning”为返回后的样子。

尝试过约束选项了吗? - user1831200
是的,如问题所述。 - Dan2552
你有没有解决这个问题?我在 iPhone 上看到了相同的行为,其中导航控制器内部有一个滚动视图。我注意到的另一件事是,如果我再次推送和弹出,它就会正确设置。所以每隔一次似乎会出现问题。 - James
不,我从来没有弄清楚。如果你自己解决了,请更新。 - Dan2552
3个回答

1

我遇到了与滚动视图和自动布局相关的问题(iOS6-无法正常工作,iOS7-可以正常工作),当然这并不是完美的解决方案,但似乎它能够工作。希望这能帮到你:

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

    [self performSelector:@selector(content) withObject:nil afterDelay:0.0];
}

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

    offset = self.scrollView.contentOffset;
}

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

   self.scrollView.contentOffset = CGPointZero;
}

- (void)content
{
    [self.scrollView setContentOffset:offset animated:NO];
}

0
这里是我找到的一个简单解决方案。(假设父视图应该跨越整个contentSize)使用UIScrollView的这个子类:
@interface BugFixScrollView : UIScrollView
@end
@implementation BugFixScrollView
-(void)layoutSubviews
{
    [super layoutSubviews];
    UIView *view=[self.subviews firstObject];
    if(view)
    {
        CGRect rect=view.frame;
        rect.origin=CGPointMake(0, 0);
        view.frame=rect;
    }
}
@end

每次自动布局出现问题时,它只是重置原点。在放置UIScrollView后,可以通过更改类名来在InterfaceBuilder中使用此类。


0
在-(void)viewWillAppear:(BOOL)animated中,获取子视图消失前的框架,然后每次视图出现时手动重置子视图的框架。
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
globalFrameVariable = subview.frame;
[subview removeFromSuperview];
}

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[subview setFrame:globalFrameVariable];
[scrollView addSubview:subview];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接