STP 0.3.0

STP 0.3.0

测试测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2015年11月
SPM支持 SPM

Chris O'Neil 维护。



STP 0.3.0

  • 作者:
  • Chris O'Neil

标准模板协议

满足您的日常 iOS 需要的基本协议

示例

UIGestureRecognizerProtocols

关于

Swift 2.0 通过增强协议和协议扩展示开了新的机遇。这个库试图使用面向协议编程来解决 iOS 应用中最常见的模式,并减少创建深度复杂子类树的必要性。

为什么使用协议?

我们往往发现自己陷入深度和复杂的子类化树中,只是为了从我们的应用程序中提取 comune 行为。这使得我们的代码不灵活,难以导航,并且包含过多的依赖。使用协议来实现公共功能允许我们创建默认行为,而不需要进行复杂的子类化。

设置

手动

  1. 将文件拖放到您的项目中,然后构建应用程序。注意,如果您这样操作,将不会获得错误修复、更新和新版本。如果您需要自定义功能,我建议您分叉此存储库。

UIGestureRecognizer 协议

我们经常发现需要从视图进行子类化,以便它们可点击、可移动、可旋转等。这些协议允许您通过简单地遵循协议来添加这些功能,但仍然为您提供了创建自定义功能和动画的灵活性。

可移动

默认情况下,使一个视图遵循可移动协议将连接一个 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。以下是我计划在不久的将来要完成的工作。

  1. 为 3D 触摸压力手势创建一个协议。
  2. 为支持压力触控的控制器创建一个协议,实现默认的 peek 和 pop。
  3. 为控制器创建一个协议,可以在下拉时显示错误横幅。

许可

Standard Template Protocols 采用 MIT 许可证发布。请参阅 LICENSE 的详细信息。