iOS捏手势控制堆栈视图间距

Posted

技术标签:

【中文标题】iOS捏手势控制堆栈视图间距【英文标题】:iOS pinch gesture to control stack view spacing 【发布时间】:2021-04-14 10:13:14 【问题描述】:

我有一个基于日历的应用程序

我希望用户能够通过捏合来放大和缩小日历。这是我的代码:

let p = UIPinchGestureRecognizer(target: self, action: #selector(pinch))
view.addGestureRecognizer(p)

@objc func pinch(gestureRecognizer gesture: UIPinchGestureRecognizer) 
    print("----------")
    print("Spacing: \(timeStack.spacing)")
    print("Gesture: \(gesture.scale)")
    var spacing = timeStack.spacing * gesture.scale
    if spacing > 70 
        spacing = 70
     else if spacing < 10 
        spacing = 10
    
    timeStack.spacing = spacing

我有一个 UIStackView,其中包含名为 timeStack 的标签,我的代码正在根据手势的比例更改其间距。

这就是我运行它时发生的情况。它确实有效,但即使是最小的手势也会调整它的大小,而且非常不自然:

我想知道如何改进我的代码,使其更像是放大 ios 日历应用程序。 谢谢。

【问题讨论】:

您必须在手势开始时保持间距,因为比例仅对该值有效。新间距是手势开始处的间距 x 新比例 添加:设置时间stack.spacing新值后的gesture.scale = 1.0 【参考方案1】:

每次重置刻度:

@objc func pinch(gestureRecognizer gesture: UIPinchGestureRecognizer) 
    print("----------")
    print("Spacing: \(timeStack.spacing)")
    print("Gesture: \(gesture.scale)")
    var spacing = timeStack.spacing * gesture.scale
    if spacing > 70 
        spacing = 70
     else if spacing < 10 
        spacing = 10
    
    timeStack.spacing = spacing
    // reset gesture scale to prevent cumulative effect
    gesture.scale = 1.0

【讨论】:

应该是= 而不是==

以上是关于iOS捏手势控制堆栈视图间距的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中以指定的等间距在水平堆栈视图中分布项目

如何在 iOS 中将堆栈视图中的第一个视图置于最前面? [复制]

ScrollView 的子视图上的旋转手势和它的捏缩放可以一起工作吗?

在下次触摸之前无法接收系统手势状态通知

iOS 等间距视图

iOS - 在堆栈视图中拉伸的图像