2016-08-03 174 views
1

使用LTInfiniteScrollView,我能够进行动画显示生长或低于使用下面的代码图像中示出的圆圈:移动视图,而滚动

- (void)updateView:(UIView *)view withProgress:(CGFloat)progress scrollDirection:(ScrollDirection)direction { 
    CGFloat size = 50; 
    CGPoint center = view.center; 
    view.center = center; 
    size = size * (1.4 - 0.5 * (fabs(progress))); 
    view.frame = CGRectMake(0, 0, size, size); 
    view.layer.cornerRadius = size/2; 
    view.center = center; 
} 

Current Implementation

什么我想实现的是弧形移动效果,同时像下图一样滚动。我想要移动圆弧路径中的圆。是否有方法或公式来计算Y的新值,使圆看起来像是在弧路径中移动?

What I want to implement.

+0

你试过http://stackoverflow.com/questions/17995681/animate-a-uiview-along-an-arc? –

+0

谢谢。我之前有机会看看那个链接,但它不能满足我的需要,因为我想根据滚动视图的偏移来移动该圆圈。 – Xchord

+0

你有没有找到这个解决方案? – Florensvb

回答

1

这里是我落得这样做,对我来说工作得很好至今:

我的故事板设置:

Storyboard Setup

什么,你可以在这里看到是一个正常UIScrollViewUIView作为内容视图。内容视图内部有一个垂直UIStackView,它负责平等放置图像。有一个堆栈也很好,因为您可以简单地添加或删除图像,而不必重新约束任何东西,或者为每个图像设置插口。相反,您可以只限制堆栈视图并为视图控制器创建一个出口,并使用它的属性遍历您的图像。

正如你所看到的,我其实UIImageView'Profile_One'在另一个UIView内。这是没有必要的,但我会解释使用下面的图片:

Screenshot

我基本上限制了正常UIView是有像UIScrollView的高度相同,但内里的UIImageView,只有它的一半高度。我这样做,因为当图像沿着路径向上移动,并且用户试图将其拖回时,触摸通常在UIScrollViews范围之外,而不是触摸。

这对于一般设置来说非常重要。现在这里是神奇的:

为了让图像移动到任何他们想要的位置,请确保您禁用UIScrollView及其所有子视图的clipsToBounds

现在我只分配UIScrollViews委托给UIViewController和覆盖

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    arrangeImageStack() 
} 

这里是我的arrangeImageStack方法做:

func arrangeImageStack() { 
    for arrangedSubview in imageStack.arrangedSubviews { 
     // Subview is the UIImageViw 
     let subview = arrangedSubview.subviews[0] 
     // X has to be translated from the image's superview to the view controller's view 
     let x = subview.superview?.convert(subview.center, to: view).x 
     // Then move the center along the new Y value 
     subview.center = view.convert(CGPoint(x: x!, y: getYOnCircumference(forX: x!) - scrollView.contentOffset.y), to: subview.superview) 
    } 
} 

这里是神奇getYOnCircumference(forX: CGFloat)

func getYOnCircumference(forX x : CGFloat) -> CGFloat { 
    let converted_x = x - view.frame.width/2 
    let radius = profileImageView.frame.width 
    let result = sqrt(abs(pow(radius, 2) - pow(converted_x, 2))) 
    return result 
} 

不要co由于converted_x的影响,这只是因为我想让图像对齐的路径位于一个圆圈内,比视图控制器的视图大得多,以获得圆滑的圆滑度。您必须确保插入公式的X值符合您的CIRCLE的坐标系,而不是您的VIEW。然后简单地获取该圆的半径并将其全部插入到公式中,您可以在“求解坐标”一节中看到this link

您的UIScrollView现在总是会根据自己的滚动,在圆形路径上转换UIStackView中的所有图像。

我真的希望这可以帮助你,因为我一直在试图找到一个解决方案,这个完全相同的问题几个月。

祝你好运!