Skip to content

Instantly share code, notes, and snippets.

@wentin
Created December 4, 2014 21:33
Show Gist options
  • Save wentin/500cf1e148e726c32dda to your computer and use it in GitHub Desktop.
Save wentin/500cf1e148e726c32dda to your computer and use it in GitHub Desktop.
ShotsApp-Gestures study note
//
// 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