在UINavigationController推送和弹出后,UIScrollView子项跳转

时间:2012-11-16 17:00:43

标签: ios xcode uiscrollview interface-builder xcode-storyboard

所以我的iPad应用程序上有一个UIScrollView,只有一个子视图(它本身就是所有控件的父视图)。滚动一切正常。旋转工作正常(整个视图适合纵向,在风景上滚动)。在UINavigationController上推一个新屏幕,然后再回来打破它。

看起来滚动视图的孩子的框架相对于滚动位置向上移动,但滚动视图保持在底部(整个子视图向上移动)。

我已经尝试在故事板上与Constraints进行战斗,几个小时,并且无法解决可能导致此问题的原因。

How it starts How it looks like after navigating and returning

3 个答案:

答案 0 :(得分:1)

我在滚动视图和自动布局方面遇到了同样的问题(iOS 6 - 不起作用,iOS 7 - 工作正常),当然这不是完美的解决方案,但似乎有效。希望它会对你有所帮助:

- (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];
}

答案 1 :(得分:0)

在子视图消失之前获取子视图的帧,然后在每次视图出现时手动重置子视图的帧 - (void)viewWillAppear:(BOOL)动画。

-(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];
}

答案 2 :(得分: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中使用此类。