使用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()
我想要实现的是弧形移动效果,同时滚动如下图所示。我想在弧形路径中移动圆圈。是否有方法或公式来计算Y的新值,使圆圈看起来像是在弧形路径中移动?
答案 0 :(得分:1)
以下是我最终做的事情,对我来说,到目前为止效果非常好:
我的故事板设置:
您在此处看到的内容是UIScrollView
,其中UIView
为内容视图。内容视图内部有一个垂直UIStackView
,它可以平等地放置图像。拥有一个堆栈也很好,因为你可以简单地添加或删除图像,而不必重新约束任何东西,或者为每个图像设置插座。相反,您只能限制堆栈视图并为视图控制器创建一个插座并使用其arrangedSubviews
属性来迭代图像。
正如您所看到的,我实际上已经拥有了UIImageView
' Profile_One'在另一个UIView
内。这不是必要的,但我将使用以下图片解释:
基本上我将普通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
内的每张图片转换为圆形路径。
我真的希望这会对你有所帮助,因为我几个月来一直试图找到解决这个问题的方法。
祝你好运!