UIScrollView - 滚动时移动子视图

时间:2014-06-28 04:45:34

标签: ios iphone objective-c uiview uiscrollview

当后者在X轴上滚动时,我在Y轴上的滚动视图内移动子视图时遇到了一个问题。

如何在X轴上滚动UIScrollView时,可靠地将子视图的Y轴更改为某个点?

进一步澄清:

我有一个分页的UIScrollView,当下一页的50%可见时会自动转到下一页。

现在,我要做的是将图像从视图中心(它居中)移动,在Y轴上移动到视图顶部,直到它到达Y点原点40点,同时滚动scrollview(superview)水平。

当我水平滚动scrollView时,图像的Y原点(或中间Y,因为它写在下面的代码中)会减少到某一点(在我的情况下是40点)并且保持在那里而我是滚动浏览其他页面。

现在我正在使用scrollview的contentOffset.x来计算子视图的Y轴,但是我从contentOffset.x得到的值是不可靠的,因为该属性大部分时间都在跳过值。滚动到右scrollView.contentOffset.x * 1.34时我还必须使用补偿值,我真的不想手动计算(我希望图像停在origin.y = 40);

我在scrollViewDidScroll内使用的代码:

CGPoint headerImageCenter = self.logo.center;

    if (scrollView.contentOffset.x < 0) {
        // We're scrolling right, move image back to center.x and make a bounce effect
        headerImageCenter.y = self.view.center.y - (scrollView.contentOffset.x / 3);
        headerImageCenter.x = self.view.center.x + scrollView.contentOffset.x;

    } else {
        // We're scrolling left, move image to top
        if (self.pageControl.currentPage == 0) {

            headerImageCenter.y = self.view.center.y - (scrollView.contentOffset.x * 1.34);
        }

        headerImageCenter.x = self.view.center.x + scrollView.contentOffset.x;
    }


    self.logo.center = headerImageCenter;

我正在尝试从Flickr的应用程序重现以下动画,其中徽标位于顶部并在滚动时保持在那里: http://goo.gl/JSLDTq

我非常感谢任何帮助!谢谢!

2 个答案:

答案 0 :(得分:0)

如果您想要一些建议,只需尝试此解决方案的动画

将“flikerLabel”作为self.view的子视图而不是scrollview,并在索引移动到1时设置动画

 [UIView animateWithDuration:0.5f animations:^(void){

     flikerLabel.rect = CGRectMake(200,100,100,50);
     //change font size if you want it will automatic do animation like gif
 }];

答案 1 :(得分:0)

首先,我建议不要将self.logo作为scrollview的子视图,因此您不需要弄乱x坐标。 然后我发现更容易计算放置的某个百分比值,即

CGFloat percentage = scrollView.contentOffset.x/scrollView.bounds.size.width;
percentage = MAX(0, MIN(1, percentage)); // Limit percentage in this case, but calculating it different and not limiting could give you interesting bounce effects

只需根据百分比计算您的观看中心:

CGFloat startY = CGRectGetMidY(self.view.bounds);
CGFloat targetY = 40;
CGFloat currentY = startY*(1 - percentage) + targetY*percentage;

我怀疑scrollViewDidScroll中的值对于这种情况不够可靠。但你可以看一下https://developer.apple.com/library/ios/samplecode/StreetScroller/他们是UIScrollView的子类,并使用layoutSubviews定位事物。