Home

Awesome

<p align="center"><img src="example.gif" width="600px"/></p> <p align="center"> <a href="https://travis-ci.org/BalestraPatrick/SquishButton"> <img src="https://dashboard.buddybuild.com/api/statusImage?appID=594d396430fb80000135db8f&branch=master&build=latest" alt="buddybuild" /> </a> <a href="https://github.com/Carthage/Carthage"> <img src="https://img.shields.io/badge/carthage-compatible-4BC51D.svg?style=flat" alt="Carthage" /> </a> <a href="http://cocoapods.org/pods/HapticButton"> <img src="https://img.shields.io/cocoapods/l/HapticButton.svg?style=flat" alt="License" /> </a> <a href="http://cocoapods.org/pods/SquishButton"> <img src="https://img.shields.io/cocoapods/p/SquishButton.svg?style=flat" alt="Platform" /> </a> <a href="https://twitter.com/BalestraPatrick"> <img src="https://img.shields.io/badge/contact-@BalestraPatrick-yellow.svg?style=flat" alt="Twitter: @BalestraPatrick" /> </a> </p>

HapticButton

📖 Description

HapticButton replicates the behavior of the buttons in the iOS 10 and 11 Control Center as well as in the Home app. A device with 3D Touch is required to fully experience the haptic feedback on supported devices. It is implemented as a subclass of UIControl, so feel free to further customize it to your needs.

The user is required to press the button and activate 3D Touch with a minimum pressure threshold (you can specify the minimum value to trigger the button via the feedbackThreshold property). This allows for a cool interaction that gives a haptic feedback to the user when the button is triggered. 👍

For the best experience, install the example on a device. 📱

The example project shows how to set up HapticButton in a few different ways.

@IBOutlet weak var button: HapticButton!
button.mode = .label(text: "Hello! 👋")
// Use the delegate method to be notified when the button is pressed.
button.delegate = self
let blurButton = HapticButton(mode: .image(image: #imageLiteral(resourceName: "swift")))
blurButton.addBlurView(style: .light)
// Add custom target selector to the touch up inside event.
blurButton.addTarget(self, action: #selector(blurButtonPressed(_:)), for: .touchUpInside)
let blurButton = HapticButton(mode: .label(text: "Hello Blur!"))
darkBlurButton.textLabel.textColor = .white
darkBlurButton.addBlurView(style: .dark)
// Pass closure to be invoked when the button is pressed.
darkBlurButton.onPressed = {
	print("Dark blur button pressed.")
}

🎨 Customizations

These are the public properties that allow you to customize the control. In case you are thinking to modify HapticButton even further, consider creating a Pull Request! 👏🏻

public weak var delegate: HapticButtonDelegate?

/// The closure invoked when the button is pressed.
public var onPressed: Callback?

/// The minimum pressure that the button press has to receive in order to trigger the related haptic feedback. The value has to be between 0 and 1 and the default is 0.25.
public var feedbackThreshold = 0.25

/// If the button is in mode `label`, this `UILabel` is part of the button hierarchy. Modify this object directly for more customizations on the displayed text.
public lazy var textLabel: UILabel

/// If the button is in mode `image`, this `UIImageView` is part of the button hierarchy. Modify this object directly for more customizations on the displayed image.
public lazy var imageView: UIImageView

/// The current mode of the button.
public var mode = HapticButtonMode.label(text: "Title")

🔞 Requirements

iOS 10.0 and Swift 3.2 are required.

If you are using Swift 4, please use the swift4 branch.

🛠 Installation

HapticButton is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod "HapticButton"

You can also use Carthage if you prefer. Add this line to your Cartfile.

github "BalestraPatrick/HapticButton"

👨‍💻 Author

I'm Patrick Balestra.

Email: me@patrickbalestra.com

Twitter: @BalestraPatrick.

License

HapticButton is available under the MIT license. See the LICENSE file for more info.