swiftでuikitdynamics
TRANSCRIPT
SwiftでUIKitDynamics
Shinji Kobayashi GentleSoft
もくもくiOS 1周年LT会@Retty
Name:Shinji Kobayashi
Twitter:@gentlejkov
GentleSoft
Who are you?
http://gentlesoft.net
https://github.com/gentlesoft/UIKitDynamicsTest
• 画面遷移 • UIViewを動かす
• UICollectionViewで多数のオブジェクト制御
UIDynamicsの使い道
• 画面遷移 • UIViewを動かす
• UICollectionViewで多数のオブジェクト制御
UIDynamicsの使い道
画面遷移
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を実装
画面遷移
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?
インスタンスの遅延生成と初期化は便利?
画面遷移
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を呼ぶ
• 画面遷移 • UIViewを動かす
• UICollectionViewで多数のオブジェクト制御
UIDynamicsの使い道
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が使えないのはちょっと不便?
• 画面遷移 • UIViewを動かす
• UICollectionViewで多数のオブジェクト制御
UIDynamicsの使い道
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の追加時に一瞬アニメーションが止まる • ときおり動かなくなる・・・
1周年おめでとう ございます