请注意:此问题和答案所涉及的错误似乎已在 iOS 7 中修复。此答案的其余部分仅与 iOS 6 相关(可能更早)。
这里展示的行为是UIScrollView
类中的一个错误。正如 OP 所指出的,在从模态呈现UIViewController
的场景返回到包含 a 的场景后UIScrollView
,它UIScrollView
会采用它当前滚动到的任何点并开始表现得好像那是它的起源。这意味着如果您在模态显示另一个视图控制器之前向下滚动滚动视图,则在返回带有滚动视图的场景时无法向上滚动。
当您从视图层次结构中删除滚动视图并重新添加它时,即使不更改其窗口,也会发生同样的事情。
您可以通过在关闭模式视图控制器后将contentOffset
滚动视图设置回{0,0}
它再次显示之前来解决此问题。如果您确实想保留用户在触发模态之前滚动到的点,那么在重新显示之后,UIScrollView
您可以将contentOffset
返回设置为重置之前的任何内容。
这是一个UIScrollView
修复错误的子类,而无需在您从模式返回时将滚动视图重置到顶部:
@interface NonBuggedScrollView : UIScrollView
@end
@implementation NonBuggedScrollView {
CGPoint oldOffset;
}
-(void)willMoveToWindow:(UIWindow *)newWindow {
oldOffset = self.contentOffset;
self.contentOffset = CGPointMake(0,0);
}
-(void)willMoveToSuperview:(UIView *)newSuperview {
oldOffset = self.contentOffset;
self.contentOffset = CGPointMake(0,0);
}
-(void)didMoveToWindow {
self.contentOffset = oldOffset;
}
-(void)didMoveToSuperview {
self.contentOffset = oldOffset;
}
@end
如果您宁愿在 a中而UIViewController
不是在UIScrollView
子类中执行此操作,请更改viewWillAppear:
andviewDidAppear
方法中的内容偏移量。
如果您不想在用户从模态返回时保留用户的滚动位置,而只想UIScrollView
按照 OP 的要求滚动到顶部,那么您所需要的只是更简单的:
@interface NonBuggedScrollView : UIScrollView
@end
@implementation NonBuggedScrollView
-(void)willMoveToWindow:(UIWindow *)newWindow {
self.contentOffset = CGPointMake(0,0);
}
-(void)willMoveToSuperview:(UIView *)newSuperview {
self.contentOffset = CGPointMake(0,0);
}
@end