Skip to content

Instantly share code, notes, and snippets.

@clmntcrl
Last active August 29, 2015 14:05
Show Gist options
  • Save clmntcrl/d9351058a31f2b5acd9f to your computer and use it in GitHub Desktop.
Save clmntcrl/d9351058a31f2b5acd9f to your computer and use it in GitHub Desktop.
Pressable flat button
//
// PressableButton.swift
//
// Created by clmntcrl on 19/08/2014.
// Copyright (c) 2014 clmntcrl. All rights reserved.
//
import UIKit
private let _defaultShadowColor = UIColor.blackColor()
private let _defaultShadowOffset = CGSize(width: 2.0, height: 4.0)
class PressableButton: UIButton {
var pressed = false
var shadowColor: UIColor {
get { return UIColor(CGColor: layer.shadowColor) }
set { layer.shadowColor = newValue.CGColor }
}
var shadowOffset: CGSize {
get { return layer.shadowOffset }
set { layer.shadowOffset = newValue }
}
private var _shadowOffset = CGSizeZero
override var enabled: Bool {
didSet { _stateChange() }
}
override var highlighted: Bool {
didSet { _stateChange() }
}
override var selected: Bool {
didSet { _stateChange() }
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
_makeItPressable()
}
private func _makeItPressable() {
shadowColor = _defaultShadowColor
shadowOffset = _defaultShadowOffset
layer.shadowOpacity = 1.0
layer.shadowRadius = 0.0
}
private func _stateChange() {
if state == .Highlighted {
if !pressed {
pressed = true
_shadowOffset = shadowOffset
shadowOffset.width = (-1.0...1.0).contains(_shadowOffset.width) ? 0.0 : (_shadowOffset.width.isSignMinus ? -1.0 : 1.0)
shadowOffset.height = (-1.0...1.0).contains(_shadowOffset.height) ? 0.0 : (_shadowOffset.height.isSignMinus ? -1.0 : 1.0)
transform.tx = _shadowOffset.width - shadowOffset.width
transform.ty = _shadowOffset.height - shadowOffset.height
}
} else {
if pressed {
pressed = false
shadowOffset = _shadowOffset
transform.tx = 0.0
transform.ty = 0.0
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment