|
// |
|
// 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 |
|
} |
|
} |
|
} |
|
|
|
} |