满足您的日常 iOS 需要的基本协议
UIGestureRecognizerProtocols
Swift 2.0 通过增强协议和协议扩展示开了新的机遇。这个库试图使用面向协议编程来解决 iOS 应用中最常见的模式,并减少创建深度复杂子类树的必要性。
我们往往发现自己陷入深度和复杂的子类化树中,只是为了从我们的应用程序中提取 comune 行为。这使得我们的代码不灵活,难以导航,并且包含过多的依赖。使用协议来实现公共功能允许我们创建默认行为,而不需要进行复杂的子类化。
我们经常发现需要从视图进行子类化,以便它们可点击、可移动、可旋转等。这些协议允许您通过简单地遵循协议来添加这些功能,但仍然为您提供了创建自定义功能和动画的灵活性。
默认情况下,使一个视图遵循可移动协议将连接一个 UIPanGestureRecognizer
并允许用户点击视图并在屏幕上拖动它。默认行为是将视图拖动在其父视图内部。创建一个可移动视图的方法很简单:
class MyMoveableView : UIView, Moveable {
init(frame: CGRect) {
super.init(frame: frame)
self.makeMoveable()
}
}
要在开始或完成时执行操作,或使用自定义的逻辑来处理移动或动画,请实现 Moveable
协议中的相应方法。
func didStartMoving()
func didFinishMoving(velocity:CGPoint)
func canMoveToX(x:CGFloat) -> Bool
func canMoveToY(y:CGFloat) -> Bool
func translateCenter(translation:CGPoint, velocity:CGPoint, startPoint:CGPoint, currentPoint:CGPoint) -> CGPoint
func animateToMovedTransform(transform:CGAffineTransform)
默认情况下,使一个视图遵循可捏合协议将连接一个 UIPinchGesetureRecognizer
并允许用户缩放视图。创建一个可捏合视图的方法很简单:
class MyPinchableView : UIView, Pinchable {
init(frame: CGRect) {
super.init(frame: frame)
self.makePinchable()
}
}
要在启动或结束时执行操作,或者创建自定义转换或动画逻辑,只需在 Pinchable
协议中实现适当的方法。
func didStartPinching()
func didFinishPinching()
func maximumPinchScale() -> CGFloat
func minimumPinchScale() -> CGFloat
func transformWithScale(scale:CGFloat, lastScale:CGFloat, velocity:CGFloat) -> CGAffineTransform
func animateToPinchedTransform(transform:CGAffineTransform)
默认情况下,使视图符合 Rotatable
协议将附加一个 UIRotationGestureRecognizer
并允许用户使用两个手指旋转视图。创建一个可旋转的视图非常简单
class MyRotatableView : UIView, Rotatable {
init(frame: CGRect) {
super.init(frame: frame)
self.makeRotatable()
}
}
要在启动或结束时执行操作,或者创建自定义转换或动画逻辑,只需在 Rotatable
协议中实现适当的方法。
func didStartRotating()
func didFinishRotating(velocity:CGFloat)
func minimumRotation() -> CGFloat
func maximumRotation() -> CGFloat
func transformWithRotation(rotation:CGFloat, lastRotation:CGFloat, velocity:CGFloat) -> CGAffineTransform
func animateToRotatedTransform(transform:CGAffineTransform)
默认情况下,使视图符合 Tappable
协议将附加一个 UILongPressGestureRecognizer
并允许用户进行触摸。它将调用 didTap()
方法并将视图的 alpha
在按下状态设置为 0.5
,在抬起状态设置为 1.0
。创建一个可触摸的视图非常简单
class MyTappableView : UIView, Tappable {
init(frame: CGRect) {
super.init(frame: frame)
self.makeTappable()
}
func didTap() {
print("tapped!")
}
}
要自定义上下状态和/或调整最小按下时间和允许的运动,只需在 Tappable
协议中实现适当的方法。
func didTap()
func didTouchDown()
func didTouchUp()
func minimumPressDuration() -> NSTimeInterval
func allowableMovement() -> CGFloat
默认情况下,使视图符合 Forceable
协议将附加一个 ForceTouchGestureRecognizer
并允许用户用压力按下。它将调用 didForce()
方法,但没有任何默认行为。创建一个可施压的视图非常简单
class ForceView: UIView, Forceable {
override init(frame: CGRect) {
super.init(frame: frame)
self.makeForceable()
}
}
要自定义压力效果,只需在 Forceable
协议中实现适当的方法。
func didStartForcing(force:CGFloat)
func didForce(force:CGFloat, lastForce:CGFloat)
func didFinishForcing(force:CGFloat)
因为协议是可组合的,所以您可以混合匹配这些协议来创建更动态的视图。创建一个可移动、可捏合、可旋转和可触摸的视图非常简单
class MyAwesomeView : UIView, Moveable, Rotatable, Pinchable, Tappable {
init(frame: CGRect) {
super.init(frame: frame)
self.makeMoveable()
self.makeRotatable()
self.makePinchable()
self.makeTappable()
}
}
如果有什么问题、想法或者只是想贡献,您可以随时给我发邮件或者在推特上联系我。
t: @chrisoneil_ e: [email protected]
特别感谢 jhurray 激励我去写一些开源代码。
我们还有很多可以做的事情,我很愿意 hear 你建议并获得 pull reques。以下是我计划在不久的将来要完成的工作。
Standard Template Protocols 采用 MIT 许可证发布。请参阅 LICENSE 的详细信息。