OneFingerRotation 是一个轻量级的 SwiftUI 框架,使您能够通过单个修饰符向任何视图添加单指旋转手势。对于想要在 SwiftUI 应用程序中快速轻松地实现 旋转功能,而无需处理复杂手势识别器的开发者来说,这个库非常完美。
当前版本: 1.2.0
该框架由一系列修饰符组成,您可以将其应用于 SwiftUI 项目中的任何视图。建议在框架修饰符之上使用等宽高的 frame 修饰符,这将确保旋转发生在特定视图内部。 示例
.frame(width: 400, height: 400)
一次只能使用框架的一个修饰符。
以下是框架中修饰符的列表
简单旋转允许使用单指进行简单旋转。
声明
.simpleRotation()
自定义
rotationAngle: 标识元素的原始角度
[类型: Angle - 默认值: .degrees(0)]
angleSnap: 允许使用角度因子进行捕捉,角度因子标识角度的基本倍数
[类型: Binding<Double> - 默认值: 未声明]
.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()
自定义
rotationAngle: 标识元素的原始角度
[类型: Angle - 默认值: .degrees(0)]
autoRotationSpeed: 指示内容在运动期间的旋转速度。
[类型: Binding<Double> - 默认值: 20]
autoRotationActive: 指示内容是否必须旋转,允许暂停旋转。
[类型: Binding<Bool> - 默认值: true]
.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
}
)
自定义
animation: 此参数控制从修饰符外部更改 totalAngle 期间的动画。
[类型: Animation - 默认值: 缺少值]
autoRotationSpeed: 指示内容在运动期间的旋转速度。
[类型: Binding<Double> - 默认值: 20]
autoRotationActive: 指示内容是否必须旋转,允许暂停旋转。
[类型: Binding<Bool> - 默认值: true]
.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 支持我和我的工作。 任何帮助都将不胜感激!
如果您对合作或委托感兴趣,可以通过以下渠道与我联系
邮件: matteofontana@matteofontana.app
网站: matteofontana.app
MIT 许可证
版权所有 © 2023 Matteo Fontana
特此授予许可,对获得本软件及相关文档文件(“软件”)副本的任何人免费授予许可,以便不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供给的人员提供软件,但须遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为或其他方面,由软件或软件的使用或其他交易引起、产生或与之相关。
版权所有 © 2023 Matteo Fontana