swiftでuikitdynamics

13
SwiftUIKitDynamics Shinji Kobayashi GentleSoft もくもくiOS 1周年LT@Retty

Upload: shinji-kobayashi

Post on 12-Jul-2015

247 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: SwiftでUIKitDynamics

SwiftでUIKitDynamics

Shinji Kobayashi GentleSoft

もくもくiOS 1周年LT会@Retty

Page 2: SwiftでUIKitDynamics

Name:Shinji Kobayashi

Twitter:@gentlejkov

GentleSoft

Who are you?

http://gentlesoft.net

Page 3: SwiftでUIKitDynamics

https://github.com/gentlesoft/UIKitDynamicsTest

Page 4: SwiftでUIKitDynamics

• 画面遷移 • UIViewを動かす

• UICollectionViewで多数のオブジェクト制御

UIDynamicsの使い道

Page 5: SwiftでUIKitDynamics

• 画面遷移 • UIViewを動かす

• UICollectionViewで多数のオブジェクト制御

UIDynamicsの使い道

Page 6: SwiftでUIKitDynamics

画面遷移

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を実装

Page 7: SwiftでUIKitDynamics

画面遷移

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?

インスタンスの遅延生成と初期化は便利?

Page 8: SwiftでUIKitDynamics

画面遷移

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を呼ぶ

Page 9: SwiftでUIKitDynamics

• 画面遷移 • UIViewを動かす

• UICollectionViewで多数のオブジェクト制御

UIDynamicsの使い道

Page 10: SwiftでUIKitDynamics

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が使えないのはちょっと不便?

Page 11: SwiftでUIKitDynamics

• 画面遷移 • UIViewを動かす

• UICollectionViewで多数のオブジェクト制御

UIDynamicsの使い道

Page 12: SwiftでUIKitDynamics

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の追加時に一瞬アニメーションが止まる • ときおり動かなくなる・・・

Page 13: SwiftでUIKitDynamics

1周年おめでとう ございます