滚动时在曲线/圆弧路径中移动视图

时间:2016-08-03 17:28:49

标签: ios objective-c uiscrollview

使用LTInfiniteScrollView,我能够使用以下代码为下图中显示的增长或圆圈设置动画:

import tkinter as tk
from tkinter import filedialog, ttk

def check_state():

    if getattr(root, 'csv_path', False) and getattr(root, 'dest_path', False):
        button3['state'] = 'normal'
    else:
        button3['state'] = 'disabled'

def open_csv_dialog():

    file_path = filedialog.askopenfilename(
        filetypes=(("Database files", "*.csv"), ("All files", "*.*")))
    if file_path:
        root.csv_path = file_path
    else:
        root.csv_path = None
    check_state()

def save_destination_folder():

    file_path = filedialog.askdirectory()
    if file_path:
        root.dest_path = file_path
    else:
        root.dest_path = None
    check_state()

def modify_word_doc():
   print(root.csv_path, root.dest_path)

root = tk.Tk()
ttk.Label(root, text="Step 1 - Choose CSV File.",).pack(pady=10, padx=10)
ttk.Button(root, text="Choose CSV", command= open_csv_dialog).pack()
ttk.Label(root, text="Step 2 - Choose destination folder for your letters.").pack(pady=10, padx=10)
ttk.Button(root, text="Choose Folder", command=save_destination_folder).pack()
ttk.Label(root, text="Step 3 - Select Run.").pack(pady=10, padx=10)

#We need a reference to the widget here, for the state func...

button3 = ttk.Button(root, text="Run", state='disabled', command=modify_word_doc)
button3.pack()
root.mainloop()

Current Implementation

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

What I want to implement.

1 个答案:

答案 0 :(得分:1)

以下是我最终做的事情,对我来说,到目前为止效果非常好:

我的故事板设置:

Storyboard Setup

您在此处看到的内容是UIScrollView,其中UIView为内容视图。内容视图内部有一个垂直UIStackView,它可以平等地放置图像。拥有一个堆栈也很好,因为你可以简单地添加或删除图像,而不必重新约束任何东西,或者为每个图像设置插座。相反,您只能限制堆栈视图并为视图控制器创建一个插座并使用其arrangedSubviews属性来迭代图像。

正如您所看到的,我实际上已经拥有了UIImageView' Profile_One'在另一个UIView内。这不是必要的,但我将使用以下图片解释:

Screenshot

基本上我将普通UIView限制为与UIScrollView具有相同的高度,但内部的UIImageView只有一半的高度。我这样做了,因为当图像沿着路径向上移动,并且用户试图将它们向下拖动时,触摸通常在UIScrollViews边界之外,而不是接触触摸。

对于一般设置来说太多了。现在,这就是魔术:

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

现在我刚刚将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
}

不要被converted_x混淆,这只是因为我希望图像对齐的路径位于一个圆圈内,比视图控制器大得多查看,以获得光滑的圆度。您必须确保插入公式的X值与CIRCLE- NOT YOUR VIEW的坐标系一致。然后只需获取该圆的半径并将其全部插入到公式中,您可以在this link的“{求解坐标”部分中自行查看。

您的UIScrollView现在将始终根据自己的滚动条式将UIStackView内的每张图片转换为圆形路径。

我真的希望这会对你有所帮助,因为我几个月来一直试图找到解决这个问题的方法。

祝你好运!