GitHub GitHub issues GitHub Repo stars GitHub code size in bytes GitHub release (latest by date)

OneFingerRotation 是一个轻量级的 SwiftUI 框架,使您能够通过单个修饰符向任何视图添加单指旋转手势。对于想要在 SwiftUI 应用程序中快速轻松地实现 旋转功能,而无需处理复杂手势识别器的开发者来说,这个库非常完美。

当前版本: 1.2.0


目录

用法

该框架由一系列修饰符组成,您可以将其应用于 SwiftUI 项目中的任何视图。建议在框架修饰符之上使用等宽高的 frame 修饰符,这将确保旋转发生在特定视图内部。 示例

  .frame(width: 400, height: 400)

一次只能使用框架的一个修饰符。
以下是框架中修饰符的列表

简单旋转

简单旋转允许使用单指进行简单旋转。

声明

  .simpleRotation()

自定义

  .simpleRotation(
    rotationAngle: .degrees(20)
    angleSnap: .constant(60)
  )

带惯性的简单旋转

简单惯性旋转允许视图进行简单旋转,并具有随后的惯性效果。

声明

声明应如下所示

  .simpleRotationInertia()

自定义

以下是自定义的可能性

  .simpleRotationInertia(
    friction: .constant(0.005),
    velocityMultiplier: .constant(0.1),
    decelerationFactor: .constant(0.4),
    rotationAngle: .degrees(0.0),
    angleSnap: .constant(20),
    angleSnapShowFactor: .constant(0.1)
  )

值旋转

值旋转允许使用单指进行简单旋转,并具有与总旋转角度相关联的值。

设置

要使用修饰符,必须创建一个双精度类型的变量,该变量将指示元素的起始点。 示例

  @State private var totalAngle: Double = 0.0

声明

要声明修饰符,必须链接变量和 onAngleChanged,其中必须包含链接的变量。

  .valueRotation(
    totalAngle: $totalAngle2,
    onAngleChanged: { newAngle in
    totalAngle2 = newAngle
    }
  )

自定义

  .valueRotation(
    totalAngle: $totalAngle,
    onAngleChanged: { newAngle in
    totalAngle = newAngle
    },
    animation: .spring()
  )

带惯性的值旋转

带惯性的值旋转允许在手势结束时进行值链接旋转和惯性效果。

设置

要使用修饰符,必须创建一个双精度类型的变量,该变量将指示元素的起始点。 示例

  @State private var totalAngle: Double = 0.0

声明

要声明修饰符,必须链接变量和 onAngleChanged,其中必须包含链接的变量。

  .valueRotationInertia(
      totalAngle: $totalAngle,
      onAngleChanged: { newAngle in
      totalAngle = newAngle
    }
  )

自定义

以下是自定义的可能性

  .valueRotationInertia(
    totalAngle: $totalAngle,
    friction: .constant(0.005),
    onAngleChanged: { newAngle in
      totalAngle3 = newAngle
    },
    velocityMultiplier: .constant(0.1),
    animation: .spring(),
    stoppingAnimation: $valueChange
)

自动旋转

自动旋转将自动旋转应用于简单旋转。

声明

  .autoRotation()

自定义

  .autoRotation(
    rotationAngle: .degrees(20)
    autoRotationSpeed: .constant(20),
    autoRotationActive: .constant(true)
  )

如果最后两个参数使用了变量,则可以使用绑定变量修改它们

  .autoRotation(
    rotationAngle: .degrees(20),
    autoRotationSpeed: $autoRotationSpeed,
    autoRotationActive: $autoRotationActive
  )

使用此方法将能够在修饰符使用期间修改变量

  Button(action: {
    autoRotationActive.toggle()
  }, label: {
    Text("Pause the Rotation")
  })

  Button(action: {
    autoRotationSpeed = [Insert double value here]
  }, label: {
    Text("Modify the speed")
  })

值自动旋转

值自动旋转将值链接到自动旋转的角度

设置

要使用修饰符,必须创建一个双精度类型的变量,该变量将指示元素的起始点。 示例

  @State private var totalAngle: Double = 0.0

声明

要声明修饰符,必须链接变量和 onAngleChanged,其中必须包含链接的变量。

  .valueAutoRotation(
    totalAngle: $totalAngle,
    onAngleChanged: { newAngle in
        totalAngle = newAngle
    }
  )

自定义

  .valueAutoRotation(
    totalAngle: $totalAngle,
    onAngleChanged: { newAngle in
        totalAngle = newAngle
    },
    animation: .spring(),
    autoRotationSpeed: .constant(20),
    autoRotationEnabled: .constant(true)
  )

此时也可以添加 totalAngle 的读取

  Text("The value is: \(totalAngle)")

如果最后两个参数使用了变量,则可以使用绑定变量修改它们

  .valueAutoRotation(
    totalAngle: $totalAngle,
    onAngleChanged: { newAngle in
        totalAngle = newAngle
    },
    animation: .spring(),
    autoRotationSpeed: $autoRotationSpeed,
    autoRotationActive: $autoRotationActive
  )

使用此方法将能够在修饰符使用期间修改变量

  Button(action: {
    autoRotationActive.toggle()
  }, label: {
    Text("Pause the Rotation")
  })

  Button(action: {
    autoRotationSpeed = [Insert double value here]
  }, label: {
    Text("Modify the speed")
  })

内容

带惯性的值自动旋转

具有手指旋转手势和惯性效果的自动旋转。 一应俱全。

设置

要使用修饰符,必须创建一个双精度类型的变量,该变量将指示元素的起始点。 示例

  @State private var totalAngle: Double = 0.0

声明

要声明修饰符,必须链接变量和 onAngleChanged,其中必须包含链接的变量。

  .valueAutoRotationInertia(
    totalAngle: $totalAngle,
    onAngleChanged: { newAngle in
    totalAngle = newAngle
    }
  )

自定义

以下是自定义的可能性

  .valueAutoRotationInertia(
    totalAngle: $totalAngle,
    friction: .constant(0.1)
    onAngleChanged: { newAngle in
      totalAngle = newAngle
    },
    velocityMultiplier: .constant(0.1),
    animation: .spring(),
    stoppingAnimation: $valueChange,
    autoRotationSpeed: .constant(90),
    autoRotationEnabled: .constant(true)
  )

旋钮

旋钮将 0 到 1 的范围值应用于某个角度区间。

设置

要使用修饰符,必须创建一个介于 0.0-1.0 范围内的双精度类型变量,此变量将指示旋钮的起始点。 例如,在接下来的实现中,旋钮将从中间点开始

  @State private var knobValue: Double = 0.5

声明

要声明修饰符,必须链接变量和 onKnobValueChanged,其中必须包含链接的变量。

  .knobRotation(
    knobValue: $knobValue,
    onKnobValueChanged: { newValue in
      knobValue = newValue
    }
  )

自定义

  .knobRotation(
    knobValue: $knobValue,
    minAngle: -180,
    maxAngle: +180,
    onKnobValueChanged: { newValue in
      knobValue = newValue
    },
    animation: .spring()
  )

此时也可以添加 knobValue 的读取

  Text("The value is: \(knobValue)")

如果需要从外部更改值,这是调用它的过程

  Button(action: {
    knobValue = 0.6
  }, label: {
    Text("Button")
  })

带惯性的旋钮

旋钮惯性将惯性效果应用于简单旋钮。

设置

要使用修饰符,必须创建一个介于 0.0-1.0 范围内的双精度类型变量,此变量将指示旋钮的起始点。 例如,在接下来的实现中,旋钮将从中间点开始

  @State private var knobValue: Double = 0.5

声明

要声明修饰符,必须链接变量和 onKnobValueChanged,其中必须包含链接的变量。

  .knobInertia(
    knobValue: $knobValue,
    onKnobValueChanged: { newValue in
      knobValue = newValue
    }
  )

自定义

您可以自定义这些参数

@State var valueChange: Bool = false
///Other code sections
  .knobInertia(
    knobValue: $knobValue,
    minangle: -180,
    maxAngle: +180,
    friction: .constant(0.1),
    onKnobValueChanged: { newValue in
      knobValue = newValue
    },
    velocityMultiplier: .constant(0.1),
    animation: .spring(),
    stoppingAnimation: $valueChange
  )

此时也可以添加 knobValue 的读取

  Text("The value is: \(knobValue)")

如果需要从外部更改值,这是调用它的过程
除了发送新值之外,还需要像这样切换 valueChange 的值

  Button(action: {
    knobValue = 0.6
    valueChange = true
  }, label: {
    Text("Button")
  })

版本


贡献

欢迎在特定的问题表格中提交包含相应标题和描述的新问题。 如果您愿意,您也可以填写拉取请求,以加快框架的改进。 由于代码是开源的,您可以随意处理代码。 请记住,引用此页面和个人资料将不胜感激。 谢谢!


即将推出

angleSnap 功能可以添加到所有修饰符中。 因此,这将是未来更新的目的。


捐赠 / 支持

您可以通过 buymeacoffee 支持我和我的工作。 任何帮助都将不胜感激!

Buy Me A Coffee


联系方式

如果您对合作或委托感兴趣,可以通过以下渠道与我联系

邮件: matteofontana@matteofontana.app
网站: matteofontana.app


许可证

MIT 许可证

版权所有 © 2023 Matteo Fontana

特此授予许可,对获得本软件及相关文档文件(“软件”)副本的任何人免费授予许可,以便不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供给的人员提供软件,但须遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为或其他方面,由软件或软件的使用或其他交易引起、产生或与之相关。

版权所有 © 2023 Matteo Fontana