内部有固定内容的UIScrollView

时间:2012-10-23 08:04:28

标签: ios uiscrollview

我的问题是: 在我的应用中,我希望使用UIScrollView

来实现这样的事情

enter image description here

UIScrollView将他的所有内容都放在里面。但当我到达屏幕的顶部(或者可能是屏幕的底部)时,我想锚定一些内容,例如AppStore(iOS 6)。

enter image description here

在这种情况下,“细节”,“评论”和“相关”按钮停止滚动并保持固定在顶部。

任何人都知道怎么做?

2 个答案:

答案 0 :(得分:8)

如果您的滚动视图还没有,则为其提供代理。这可能是你的视图控制器。

还为委托提供浮动视图的引用。 (在该示例中,浮动视图包含“Dettagli”,“Recensioni”和“Correlati”按钮,浮动视图在三角形切口所在的位置是透明的,并且阴影也是浮动视图的一部分。)浮动视图必须是滚动视图的子视图。

将浮动视图框架的“正常”Y坐标保存在实例变量中。例如,如果委托是视图控制器,则应该在viewDidLoad

中执行
- (void)viewDidLoad {
    [super viewDidLoad];
    originalFloatingViewY = floatingView.frame.origin.y;
}

在委托的scrollViewDidScroll:方法中,检查滚动视图是否已滚动到浮动视图“正常”位置的顶部下方。如果是这样,请将浮动视图移动到可见区域的上边缘:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self updateFloatingViewFrame];
}

- (void)updateFloatingViewFrame {
    CGPoint contentOffset = scrollView.contentOffset;

    // The floating view should be at its original position or at top of
    // the visible area, whichever is lower.
    CGFloat y = MAX(contentOffset.y, originalFloatingViewY);

    CGRect frame = floatingView.frame;
    if (y != frame.origin.y) {
        frame.origin.y = y;
        floatingView.frame = frame;
    }
}

您也可以通过继承UIScrollView并覆盖layoutSubviews来完成此操作。观看WWDC 2011中的“高级ScrollView技术”视频,了解有关此技术的更多信息。

答案 1 :(得分:0)

您需要在UIScrollView's委托方法(scrollViewDidScroll :)中处理此问题以进行滚动。当y scrollview达到该特定值时,您需要单独禁用此方向的滚动。您只需要在那里添加if条件,以便在滚动时检查并重置y点。为此,您可能必须将此特定部分保留为下方内容之外的单独滚动视图,并将其与下方滚动视图的向上移动一起移动。