Weitere ähnliche Inhalte
Ähnlich wie SwiftでUIKitDynamics (20)
Kürzlich hochgeladen (20)
SwiftでUIKitDynamics
- 6. 画面遷移
override func viewDidLoad() {
super.viewDidLoad()
!
self.transitioningDelegate = self
}
!
// MARK: - UIViewControllerAnimatedTransitioning
func animationControllerForPresentedController(presented: UIViewController,
presentingController presenting: UIViewController, sourceController source:
UIViewController) -> UIViewControllerAnimatedTransitioning? {
return DropTransition()
}
func animationControllerForDismissedController(dismissed: UIViewController) ->
UIViewControllerAnimatedTransitioning? {
return DropTransition()
}
UIViewControllerTransitioningDelegateを実装
- 7. 画面遷移
class DropTransition: NSObject, UIViewControllerAnimatedTransitioning,
UIDynamicAnimatorDelegate {
private var transitionContext : UIViewControllerContextTransitioning?
private lazy var gravity : UIGravityBehavior = {
let gravity = UIGravityBehavior()
gravity.gravityDirection = CGVector(dx: 0.5, dy: 1)
return gravity
}()
private let collision = UICollisionBehavior()
private lazy var dynamicItem : UIDynamicItemBehavior = {
let dynamicItem = UIDynamicItemBehavior()
dynamicItem.elasticity = 0.5
dynamicItem.resistance = 0.8
return dynamicItem
}()
private var animator : UIDynamicAnimator?
インスタンスの遅延生成と初期化は便利?
- 8. 画面遷移
func transitionDuration(transitionContext:
UIViewControllerContextTransitioning) -> NSTimeInterval {
return 0
}
func animateTransition(transitionContext:
UIViewControllerContextTransitioning) {
self.transitionContext = transitionContext
let from =
transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey
)!.view
let to =
transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
.view
・・・アニメーションをセット
}
override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
self.animator = nil
}
// MARK: - UIDynamicAnimatorDelegate
func dynamicAnimatorDidPause(animator: UIDynamicAnimator) {
self.transitionContext?.completeTransition(true)
}
アニメーション終了でcompleteTransitionを呼ぶ
- 10. UIViewを動かす
// MARK: Gesture
func handleGesture(recognizer: UIPanGestureRecognizer) {
switch recognizer.state {
case UIGestureRecognizerState.Began:
self.tapPos = self.attachment.anchorPoint
case UIGestureRecognizerState.Changed:
let pos = recognizer.translationInView(self.malletView)
self.attachment.anchorPoint = CGPoint(x: self.tapPos.x + pos.x,
y: self.tapPos.y + pos.y)
default:
break
}
}
• UIViewのタッチ判定はGestureRecognizerが使える
• 指定ポイントへの移動はUIAttatchmentBehavior
• Staticが使えないのはちょっと不便?
- 12. UICollectionView + UIKitDynamics
class SandboxLayout: UICollectionViewLayout, UIDynamicAnimatorDelegate {
!
・・・
!
override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) ->
UICollectionViewLayoutAttributes! {
var attr = self.animator.layoutAttributesForCellAtIndexPath(indexPath)
if attr == nil {
attr = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)
attr.frame = self.sandBoxDelegate.initSand(indexPath)
}
return attr
}
• Swiftっぽくない実装を強いられる
• animatorへのItemの追加時に一瞬アニメーションが止まる
• ときおり動かなくなる・・・