Created
December 4, 2014 21:33
-
-
Save wentin/500cf1e148e726c32dda to your computer and use it in GitHub Desktop.
ShotsApp-Gestures study note
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Home.swift | |
// ShotsApp | |
// | |
// Created by Meng To on 2014-07-29. | |
// Copyright (c) 2014 Meng To. All rights reserved. | |
// | |
import UIKit | |
class Home: UIViewController { | |
@IBOutlet weak var userButton: UIButton! | |
@IBOutlet weak var backgroundImageView: UIImageView! | |
@IBOutlet weak var backgroundMaskView: UIView! | |
@IBOutlet weak var dialogView: UIView! | |
@IBOutlet weak var popoverView: UIView! | |
@IBOutlet weak var shareView: UIView! | |
@IBOutlet weak var imageButton: UIButton! | |
@IBOutlet weak var headerView: UIView! | |
@IBOutlet weak var likeButton: UIButton! | |
@IBOutlet weak var shareButton: UIButton! | |
@IBOutlet weak var titleLabel: UILabel! | |
@IBOutlet weak var authorLabel: UILabel! | |
@IBOutlet weak var avatarImageView: UIImageView! | |
@IBOutlet weak var favoritesLabel: UILabel! | |
@IBOutlet weak var maskButton: UIButton! | |
@IBOutlet weak var emailButton: UIButton! | |
@IBOutlet weak var twitterButton: UIButton! | |
@IBOutlet weak var facebookButton: UIButton! | |
@IBOutlet weak var shareLabelsView: UIView! | |
@IBAction func maskButtonDidPress(sender: AnyObject) { | |
spring(0.5) { | |
self.maskButton.alpha = 0 | |
} | |
hideShareView() | |
hidePopover() | |
} | |
func showMask() { | |
self.maskButton.hidden = false | |
self.maskButton.alpha = 0 | |
spring(0.5) { | |
self.maskButton.alpha = 1 | |
} | |
} | |
@IBAction func likeButtonDidPress(sender: AnyObject) { | |
} | |
@IBAction func shareButtonDidPress(sender: AnyObject) { | |
shareView.hidden = false | |
showMask() | |
shareView.transform = CGAffineTransformMakeTranslation(0, 200) | |
emailButton.transform = CGAffineTransformMakeTranslation(0, 200) | |
twitterButton.transform = CGAffineTransformMakeTranslation(0, 200) | |
facebookButton.transform = CGAffineTransformMakeTranslation(0, 200) | |
shareLabelsView.alpha = 0 | |
spring(0.5) { | |
self.shareView.transform = CGAffineTransformMakeTranslation(0, 0) | |
self.dialogView.transform = CGAffineTransformMakeScale(0.8, 0.8) | |
} | |
springWithDelay(0.5, 0.05, { | |
self.emailButton.transform = CGAffineTransformMakeTranslation(0, 0) | |
}) | |
springWithDelay(0.5, 0.10, { | |
self.twitterButton.transform = CGAffineTransformMakeTranslation(0, 0) | |
}) | |
springWithDelay(0.5, 0.15, { | |
self.facebookButton.transform = CGAffineTransformMakeTranslation(0, 0) | |
}) | |
springWithDelay(0.5, 0.2, { | |
self.shareLabelsView.alpha = 1 | |
}) | |
} | |
func hideShareView() { | |
spring(0.5) { | |
self.shareView.transform = CGAffineTransformMakeTranslation(0, 0) | |
self.dialogView.transform = CGAffineTransformMakeScale(1, 1) | |
self.shareView.hidden = true | |
} | |
} | |
@IBAction func userButtonDidPress(sender: AnyObject) { | |
popoverView.hidden = false | |
let scale = CGAffineTransformMakeScale(0.3, 0.3) | |
let translate = CGAffineTransformMakeTranslation(50, -50) | |
popoverView.transform = CGAffineTransformConcat(scale, translate) | |
popoverView.alpha = 0 | |
showMask() | |
spring(0.5) { | |
let scale = CGAffineTransformMakeScale(1, 1) | |
let translate = CGAffineTransformMakeTranslation(0, 0) | |
self.popoverView.transform = CGAffineTransformConcat(scale, translate) | |
self.popoverView.alpha = 1 | |
} | |
} | |
func hidePopover() { | |
spring(0.5) { | |
self.popoverView.hidden = true | |
} | |
} | |
@IBAction func imageButtonDidPress(sender: AnyObject) { | |
springWithCompletion(0.5, { | |
self.dialogView.frame = CGRectMake(0, 0, 320, 568) | |
self.dialogView.layer.cornerRadius = 0 | |
self.imageButton.frame = CGRectMake(0, 0, 320, 240) | |
self.likeButton.alpha = 0 | |
self.shareButton.alpha = 0 | |
self.userButton.alpha = 0 | |
self.headerView.alpha = 0 | |
}, { finished in | |
self.performSegueWithIdentifier("homeToDetail", sender: self) | |
}) | |
} | |
override func preferredStatusBarStyle() -> UIStatusBarStyle { | |
return UIStatusBarStyle.LightContent | |
} | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
insertBlurView(backgroundMaskView, UIBlurEffectStyle.Dark) | |
insertBlurView(headerView, UIBlurEffectStyle.Dark) | |
let scale = CGAffineTransformMakeScale(0.5, 0.5) | |
let translate = CGAffineTransformMakeTranslation(0, -200) | |
dialogView.transform = CGAffineTransformConcat(scale, translate) | |
spring(0.5) { | |
let scale = CGAffineTransformMakeScale(1, 1) | |
let translate = CGAffineTransformMakeTranslation(0, 0) | |
self.dialogView.transform = CGAffineTransformConcat(scale, translate) | |
} | |
animator = UIDynamicAnimator(referenceView: view) | |
} | |
var animator : UIDynamicAnimator! | |
var attachmentBehavior : UIAttachmentBehavior! | |
var gravityBehavior : UIGravityBehavior! | |
var snapBehavior : UISnapBehavior! | |
@IBOutlet var panRecognizer: UIPanGestureRecognizer! | |
@IBAction func handleGesture(sender: AnyObject) { | |
let myView = dialogView | |
let location = sender.locationInView(view) | |
let boxLocation = sender.locationInView(myView) | |
if sender.state == UIGestureRecognizerState.Began { | |
// remove the snapBehavior that was added at the end of last gesture | |
animator.removeBehavior(snapBehavior) | |
// without offsetFromCenter, it only attach to it, without rotating. | |
// attachmentBehavior = UIAttachmentBehavior(item: myView, attachedToAnchor: location) | |
// offsetFromCenter makes the rotating happen. | |
// centerOffset is a vector FROM the center of the dialogView TO your fingertip position relative to dialogView | |
let centerOffset = UIOffsetMake(boxLocation.x - CGRectGetMidX(myView.bounds), boxLocation.y - CGRectGetMidY(myView.bounds)) | |
attachmentBehavior = UIAttachmentBehavior(item: myView, offsetFromCenter: centerOffset, attachedToAnchor: location) | |
// if frequency is greater than 0, it is not responsive, and seems like there are a lot of friction | |
attachmentBehavior.frequency = 0 | |
animator.addBehavior(attachmentBehavior) | |
} else if sender.state == UIGestureRecognizerState.Changed { | |
// the attachmentBehavior is set to attachedToAnchor, now we need to update the anchorPoint consitantly while fingertip is moving | |
attachmentBehavior.anchorPoint = location | |
} else if sender.state == UIGestureRecognizerState.Ended { | |
// detach | |
animator.removeBehavior(attachmentBehavior) | |
// snap back to the device view center | |
snapBehavior = UISnapBehavior(item: myView, snapToPoint: view.center) | |
animator.addBehavior(snapBehavior) | |
let translation = sender.translationInView(view) | |
if translation.y > 100 { | |
animator.removeBehavior(snapBehavior) | |
// note items with "s", generally means swift is expecting an array, it is a sematic trick to remember | |
var gravity = UIGravityBehavior(items: [myView]) | |
gravity.gravityDirection = CGVectorMake(0, 10) | |
animator.addBehavior(gravity) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment