所以我UIScrollView
在我的 iPad 应用程序上有一个带有单个子视图(它本身是所有控件的父级)。滚动一切正常。旋转效果很好(整个视图适合纵向,横向滚动)。一旦在 上推动一个新屏幕UINavigationController
,然后回来打破它。
相对于滚动位置,滚动视图的子视图看起来好像向上移动了,但滚动视图仍保持在底部(整个子视图已向上移动)。
我已经尝试与Constraints
故事板中的内容作斗争,实际上是几个小时,但无法找出可能导致这种情况的原因。
所以我UIScrollView
在我的 iPad 应用程序上有一个带有单个子视图(它本身是所有控件的父级)。滚动一切正常。旋转效果很好(整个视图适合纵向,横向滚动)。一旦在 上推动一个新屏幕UINavigationController
,然后回来打破它。
相对于滚动位置,滚动视图的子视图看起来好像向上移动了,但滚动视图仍保持在底部(整个子视图已向上移动)。
我已经尝试与Constraints
故事板中的内容作斗争,实际上是几个小时,但无法找出可能导致这种情况的原因。
我在滚动视图和自动布局方面遇到了同样的问题(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];
}
Get the frame of the subview before it disappears then manually reset the frame of the subview every time the view appears in -(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];
}
这是我找到的一个简单的解决方案。(假设父视图是为了跨越整个 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
每次自动布局搞砸时,它都会简单地重置原点。这个类可以在InterfaceBuilder中使用,只需在放置UIScrollView后更改类名即可。