okmr-d / dofavoritebutton Goto Github PK
View Code? Open in Web Editor NEWCute Animated Button written in Swift.
License: MIT License
Cute Animated Button written in Swift.
License: MIT License
Is there an objective c code for this excellent animation?
Thanks for building this great library. I am using the DoFavourite Button for Bookmarking feature in my App. I want some buttons to be selected by default. By the way i am using tableview to populate my data like this http://i.imgur.com/VoCxkJa.png
Please update it in swift 3 or swift 4
This is an awesome Pod, but you should credit Twitter's iOS App as the inspiration for the animation somewhere in the README.
2016-04-13 18:29:02.168 DOFavoriteButton-DEMO[1303:41281] -[DOFavoriteButton.DOFavoriteButton select:]: unrecognized selector sent to instance 0x7fd032c361b0
2016-04-13 18:29:02.172 DOFavoriteButton-DEMO[1303:41281] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DOFavoriteButton.DOFavoriteButton select:]: unrecognized selector sent to instance 0x7fd032c361b0'
*** First throw call stack:
(
0 CoreFoundation 0x000000010e415d85 exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000110881deb objc_exception_throw + 48
2 CoreFoundation 0x000000010e41ed3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010e364cfa __forwarding + 970
4 CoreFoundation 0x000000010e3648a8 _CF_forwarding_prep_0 + 120
5 DOFavoriteButton 0x0000000110cc6215 TFC16DOFavoriteButton16DOFavoriteButton6selectfT_T + 69
6 DOFavoriteButton-DEMO 0x000000010e22f4d3 TFC21DOFavoriteButton_DEMO14ViewController12tappedButtonfC16DOFavoriteButton16DOFavoriteButtonT + 99
7 DOFavoriteButton-DEMO 0x000000010e22f52a TToFC21DOFavoriteButton_DEMO14ViewController12tappedButtonfC16DOFavoriteButton16DOFavoriteButtonT + 58
8 UIKit 0x000000010f307a8d -[UIApplication sendAction:to:from:forEvent:] + 92
9 UIKit 0x000000010f47ae67 -[UIControl sendAction:to:forEvent:] + 67
10 UIKit 0x000000010f47b143 -[UIControl _sendActionsForEvents:withEvent:] + 327
11 UIKit 0x000000010f47a263 -[UIControl touchesEnded:withEvent:] + 601
12 UIKit 0x000000010f37a99f -[UIWindow _sendTouchesForEvent:] + 835
13 UIKit 0x000000010f37b6d4 -[UIWindow sendEvent:] + 865
14 UIKit 0x000000010f326dc6 -[UIApplication sendEvent:] + 263
15 UIKit 0x000000010f300553 _UIApplicationHandleEventQueue + 6660
16 CoreFoundation 0x000000010e33b301 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17
17 CoreFoundation 0x000000010e33122c __CFRunLoopDoSources0 + 556
18 CoreFoundation 0x000000010e3306e3 __CFRunLoopRun + 867
19 CoreFoundation 0x000000010e3300f8 CFRunLoopRunSpecific + 488
20 GraphicsServices 0x0000000113edbad2 GSEventRunModal + 161
21 UIKit 0x000000010f305f09 UIApplicationMain + 171
22 DOFavoriteButton-DEMO 0x000000010e2303b2 main + 114
23 libdyld.dylib 0x000000011136592d start + 1
24 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
Hi @okmr-d ,
First of all I would like to appreciate for creating such a cool animation buttons
I want to know is this library still in active development? I am planning to write a ReactNative wrapper around the same
Thanks
Pranav
//
// DOFavoriteButton.swift
// DOFavoriteButton
//
// Created by Daiki Okumura on 2015/07/09.
// Copyright (c) 2015 Daiki Okumura. All rights reserved.
//
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
//
import UIKit
@IBDesignable
public class DOFavoriteButton: UIButton {
private var imageShape: CAShapeLayer!
@IBInspectable public var image: UIImage! {
didSet {
createLayers(image: image)
}
}
@IBInspectable public var imageColorOn: UIColor! = UIColor(red: 255/255, green: 172/255, blue: 51/255, alpha: 1.0) {
didSet {
if (isSelected) {
imageShape.fillColor = imageColorOn.cgColor
}
}
}
@IBInspectable public var imageColorOff: UIColor! = UIColor(red: 136/255, green: 153/255, blue: 166/255, alpha: 1.0) {
didSet {
if (!isSelected) {
imageShape.fillColor = imageColorOff.cgColor
}
}
}
private var circleShape: CAShapeLayer!
private var circleMask: CAShapeLayer!
@IBInspectable public var circleColor: UIColor! = UIColor(red: 255/255, green: 172/255, blue: 51/255, alpha: 1.0) {
didSet {
circleShape.fillColor = circleColor.cgColor
}
}
private var lines: [CAShapeLayer]!
@IBInspectable public var lineColor: UIColor! = UIColor(red: 250/255, green: 120/255, blue: 68/255, alpha: 1.0) {
didSet {
for line in lines {
line.strokeColor = lineColor.cgColor
}
}
}
private let circleTransform = CAKeyframeAnimation(keyPath: "transform")
private let circleMaskTransform = CAKeyframeAnimation(keyPath: "transform")
private let lineStrokeStart = CAKeyframeAnimation(keyPath: "strokeStart")
private let lineStrokeEnd = CAKeyframeAnimation(keyPath: "strokeEnd")
private let lineOpacity = CAKeyframeAnimation(keyPath: "opacity")
private let imageTransform = CAKeyframeAnimation(keyPath: "transform")
@IBInspectable public var duration: Double = 1.0 {
didSet {
circleTransform.duration = 0.333 * duration // 0.0333 * 10
circleMaskTransform.duration = 0.333 * duration // 0.0333 * 10
lineStrokeStart.duration = 0.6 * duration //0.0333 * 18
lineStrokeEnd.duration = 0.6 * duration //0.0333 * 18
lineOpacity.duration = 1.0 * duration //0.0333 * 30
imageTransform.duration = 1.0 * duration //0.0333 * 30
}
}
override public var isSelected : Bool {
didSet {
if (isSelected != oldValue) {
if isSelected {
imageShape.fillColor = imageColorOn.cgColor
} else {
deselect()
}
}
}
}
public convenience init() {
self.init(frame: CGRect.zero)
}
public override convenience init(frame: CGRect) {
self.init(frame: frame, image: UIImage())
}
public init(frame: CGRect, image: UIImage!) {
super.init(frame: frame)
self.image = image
createLayers(image: image)
addTargets()
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
createLayers(image: UIImage())
addTargets()
}
private func createLayers(image: UIImage!) {
self.layer.sublayers = nil
let imageFrame = CGRect(x: frame.size.width / 2 - frame.size.width / 4, y: frame.size.height / 2 - frame.size.height / 4, width: frame.size.width / 2, height: frame.size.height / 2)
let imgCenterPoint = CGPoint(x: imageFrame.midX, y: imageFrame.midY)
let lineFrame = CGRect(x: imageFrame.origin.x - imageFrame.width / 4, y: imageFrame.origin.y - imageFrame.height / 4, width: imageFrame.width * 1.5, height: imageFrame.height * 1.5)
//===============
// circle layer
//===============
circleShape = CAShapeLayer()
circleShape.bounds = imageFrame
circleShape.position = imgCenterPoint
circleShape.path = UIBezierPath(ovalIn: imageFrame).cgPath
circleShape.fillColor = circleColor.cgColor
circleShape.transform = CATransform3DMakeScale(0.0, 0.0, 1.0)
self.layer.addSublayer(circleShape)
circleMask = CAShapeLayer()
circleMask.bounds = imageFrame
circleMask.position = imgCenterPoint
circleMask.fillRule = kCAFillRuleEvenOdd
circleShape.mask = circleMask
let maskPath = UIBezierPath(rect: imageFrame)
maskPath.addArc(withCenter: imgCenterPoint, radius: 0.1, startAngle: CGFloat(0.0), endAngle: CGFloat(M_PI * 2), clockwise: true)
circleMask.path = maskPath.cgPath
//===============
// line layer
//===============
lines = []
for i in 0 ..< 5 {
let line = CAShapeLayer()
line.bounds = lineFrame
line.position = imgCenterPoint
line.masksToBounds = true
line.actions = ["strokeStart": NSNull(), "strokeEnd": NSNull()]
line.strokeColor = lineColor.cgColor
line.lineWidth = 1.25
line.miterLimit = 1.25
line.path = {
let path = CGMutablePath()
path.move(to: CGPoint(x: lineFrame.midX, y: lineFrame.midY))
path.addLine(to: CGPoint(x: lineFrame.origin.x + lineFrame.width / 2, y: lineFrame.origin.y))
return path
}()
line.lineCap = kCALineCapRound
line.lineJoin = kCALineJoinRound
line.strokeStart = 0.0
line.strokeEnd = 0.0
line.opacity = 0.0
line.transform = CATransform3DMakeRotation(CGFloat(M_PI) / 5 * (CGFloat(i) * 2 + 1), 0.0, 0.0, 1.0)
self.layer.addSublayer(line)
lines.append(line)
}
//===============
// image layer
//===============
imageShape = CAShapeLayer()
imageShape.bounds = imageFrame
imageShape.position = imgCenterPoint
imageShape.path = UIBezierPath(rect: imageFrame).cgPath
imageShape.fillColor = imageColorOff.cgColor
imageShape.actions = ["fillColor": NSNull()]
self.layer.addSublayer(imageShape)
imageShape.mask = CALayer()
imageShape.mask?.contents = image.cgImage
imageShape.mask?.bounds = imageFrame
imageShape.mask?.position = imgCenterPoint
//==============================
// circle transform animation
//==============================
circleTransform.duration = 0.333 // 0.0333 * 10
circleTransform.values = [
NSValue(caTransform3D: CATransform3DMakeScale(0.0, 0.0, 1.0)), // 0/10
NSValue(caTransform3D: CATransform3DMakeScale(0.5, 0.5, 1.0)), // 1/10
NSValue(caTransform3D: CATransform3DMakeScale(1.0, 1.0, 1.0)), // 2/10
NSValue(caTransform3D: CATransform3DMakeScale(1.2, 1.2, 1.0)), // 3/10
NSValue(caTransform3D: CATransform3DMakeScale(1.3, 1.3, 1.0)), // 4/10
NSValue(caTransform3D: CATransform3DMakeScale(1.37, 1.37, 1.0)), // 5/10
NSValue(caTransform3D: CATransform3DMakeScale(1.4, 1.4, 1.0)), // 6/10
NSValue(caTransform3D: CATransform3DMakeScale(1.4, 1.4, 1.0)) // 10/10
]
circleTransform.keyTimes = [
0.0, // 0/10
0.1, // 1/10
0.2, // 2/10
0.3, // 3/10
0.4, // 4/10
0.5, // 5/10
0.6, // 6/10
1.0 // 10/10
]
circleMaskTransform.duration = 0.333 // 0.0333 * 10
circleMaskTransform.values = [
NSValue(caTransform3D: CATransform3DIdentity), // 0/10
NSValue(caTransform3D: CATransform3DIdentity), // 2/10
NSValue(caTransform3D: CATransform3DMakeScale(imageFrame.width * 1.25, imageFrame.height * 1.25, 1.0)), // 3/10
NSValue(caTransform3D: CATransform3DMakeScale(imageFrame.width * 2.688, imageFrame.height * 2.688, 1.0)), // 4/10
NSValue(caTransform3D: CATransform3DMakeScale(imageFrame.width * 3.923, imageFrame.height * 3.923, 1.0)), // 5/10
NSValue(caTransform3D: CATransform3DMakeScale(imageFrame.width * 4.375, imageFrame.height * 4.375, 1.0)), // 6/10
NSValue(caTransform3D: CATransform3DMakeScale(imageFrame.width * 4.731, imageFrame.height * 4.731, 1.0)), // 7/10
NSValue(caTransform3D: CATransform3DMakeScale(imageFrame.width * 5.0, imageFrame.height * 5.0, 1.0)), // 9/10
NSValue(caTransform3D: CATransform3DMakeScale(imageFrame.width * 5.0, imageFrame.height * 5.0, 1.0)) // 10/10
]
circleMaskTransform.keyTimes = [
0.0, // 0/10
0.2, // 2/10
0.3, // 3/10
0.4, // 4/10
0.5, // 5/10
0.6, // 6/10
0.7, // 7/10
0.9, // 9/10
1.0 // 10/10
]
//==============================
// line stroke animation
//==============================
lineStrokeStart.duration = 0.6 //0.0333 * 18
lineStrokeStart.values = [
0.0, // 0/18
0.0, // 1/18
0.18, // 2/18
0.2, // 3/18
0.26, // 4/18
0.32, // 5/18
0.4, // 6/18
0.6, // 7/18
0.71, // 8/18
0.89, // 17/18
0.92 // 18/18
]
lineStrokeStart.keyTimes = [
0.0, // 0/18
0.056, // 1/18
0.111, // 2/18
0.167, // 3/18
0.222, // 4/18
0.278, // 5/18
0.333, // 6/18
0.389, // 7/18
0.444, // 8/18
0.944, // 17/18
1.0, // 18/18
]
lineStrokeEnd.duration = 0.6 //0.0333 * 18
lineStrokeEnd.values = [
0.0, // 0/18
0.0, // 1/18
0.32, // 2/18
0.48, // 3/18
0.64, // 4/18
0.68, // 5/18
0.92, // 17/18
0.92 // 18/18
]
lineStrokeEnd.keyTimes = [
0.0, // 0/18
0.056, // 1/18
0.111, // 2/18
0.167, // 3/18
0.222, // 4/18
0.278, // 5/18
0.944, // 17/18
1.0, // 18/18
]
lineOpacity.duration = 1.0 //0.0333 * 30
lineOpacity.values = [
1.0, // 0/30
1.0, // 12/30
0.0 // 17/30
]
lineOpacity.keyTimes = [
0.0, // 0/30
0.4, // 12/30
0.567 // 17/30
]
//==============================
// image transform animation
//==============================
imageTransform.duration = 1.0 //0.0333 * 30
imageTransform.values = [
NSValue(caTransform3D: CATransform3DMakeScale(0.0, 0.0, 1.0)), // 0/30
NSValue(caTransform3D: CATransform3DMakeScale(0.0, 0.0, 1.0)), // 3/30
NSValue(caTransform3D: CATransform3DMakeScale(1.2, 1.2, 1.0)), // 9/30
NSValue(caTransform3D: CATransform3DMakeScale(1.25, 1.25, 1.0)), // 10/30
NSValue(caTransform3D: CATransform3DMakeScale(1.2, 1.2, 1.0)), // 11/30
NSValue(caTransform3D: CATransform3DMakeScale(0.9, 0.9, 1.0)), // 14/30
NSValue(caTransform3D: CATransform3DMakeScale(0.875, 0.875, 1.0)), // 15/30
NSValue(caTransform3D: CATransform3DMakeScale(0.875, 0.875, 1.0)), // 16/30
NSValue(caTransform3D: CATransform3DMakeScale(0.9, 0.9, 1.0)), // 17/30
NSValue(caTransform3D: CATransform3DMakeScale(1.013, 1.013, 1.0)), // 20/30
NSValue(caTransform3D: CATransform3DMakeScale(1.025, 1.025, 1.0)), // 21/30
NSValue(caTransform3D: CATransform3DMakeScale(1.013, 1.013, 1.0)), // 22/30
NSValue(caTransform3D: CATransform3DMakeScale(0.96, 0.96, 1.0)), // 25/30
NSValue(caTransform3D: CATransform3DMakeScale(0.95, 0.95, 1.0)), // 26/30
NSValue(caTransform3D: CATransform3DMakeScale(0.96, 0.96, 1.0)), // 27/30
NSValue(caTransform3D: CATransform3DMakeScale(0.99, 0.99, 1.0)), // 29/30
NSValue(caTransform3D: CATransform3DIdentity) // 30/30
]
imageTransform.keyTimes = [
0.0, // 0/30
0.1, // 3/30
0.3, // 9/30
0.333, // 10/30
0.367, // 11/30
0.467, // 14/30
0.5, // 15/30
0.533, // 16/30
0.567, // 17/30
0.667, // 20/30
0.7, // 21/30
0.733, // 22/30
0.833, // 25/30
0.867, // 26/30
0.9, // 27/30
0.967, // 29/30
1.0 // 30/30
]
}
private func addTargets() {
//===============
// add target
//===============
self.addTarget(self, action: #selector(touchDown), for: UIControlEvents.touchDown)
self.addTarget(self, action: #selector(touchUpInside), for: UIControlEvents.touchUpInside)
self.addTarget(self, action: #selector(touchDragExit), for: UIControlEvents.touchDragExit)
self.addTarget(self, action: #selector(touchDragEnter), for: UIControlEvents.touchDragEnter)
self.addTarget(self, action: #selector(touchCancel), for: UIControlEvents.touchCancel)
}
@objc func touchDown(sender: DOFavoriteButton) {
self.layer.opacity = 0.4
}
@objc func touchUpInside(sender: DOFavoriteButton) {
self.layer.opacity = 1.0
}
@objc func touchDragExit(sender: DOFavoriteButton) {
self.layer.opacity = 1.0
}
@objc func touchDragEnter(sender: DOFavoriteButton) {
self.layer.opacity = 0.4
}
@objc func touchCancel(sender: DOFavoriteButton) {
self.layer.opacity = 1.0
}
public func select() {
isSelected = true
imageShape.fillColor = imageColorOn.cgColor
CATransaction.begin()
circleShape.add(circleTransform, forKey: "transform")
circleMask.add(circleMaskTransform, forKey: "transform")
imageShape.add(imageTransform, forKey: "transform")
for i in 0 ..< 5 {
lines[i].add(lineStrokeStart, forKey: "strokeStart")
lines[i].add(lineStrokeEnd, forKey: "strokeEnd")
lines[i].add(lineOpacity, forKey: "opacity")
}
CATransaction.commit()
}
public func deselect() {
isSelected = false
imageShape.fillColor = imageColorOff.cgColor
// remove all animations
circleShape.removeAllAnimations()
circleMask.removeAllAnimations()
imageShape.removeAllAnimations()
lines[0].removeAllAnimations()
lines[1].removeAllAnimations()
lines[2].removeAllAnimations()
lines[3].removeAllAnimations()
lines[4].removeAllAnimations()
}
}
I had a UITableViewCell with 3 DOFavoriteButtons and some UILabels yet my scrolling performance was abysmal. I hid the 3 DOFavoriteButtons and my scrolling performance was silky smooth. I really like the animation, I think it's really nice but unfortunately it's not good enough to sacrifice the smoothness of my app. Any solutions I could try? Thanks
I added DOFavoriteButton to my project. The animations work fine. However if the Button does have isSelected=true
it creates this weird rectangle on the top left corner of the view:
It does not appear for isSelected=false
.
After a very long time I finally found the problem. The Button Type has to be set to Custom
. If it is set to System
it does not work and does create these weird effects.
I just want to leave this here if someone else does encounter this problem.
I'm not good at reading Swift language,
do you mind if I translate DOFavoriteButton to Objective-C?
Thanks!
Hi, thank you for sharing this nice animation button, i really like it!
I manually installed the library and followed the instructions for storyboard setup and it works but it also gives me two red errors that I'm going to report:
Am I making any mistakes?
Kind regards
Alessandro
I get a few warnings saying that the selectors need to change form:
self.addTarget(self, action: "touchDown:", forControlEvents: UIControlEvents.TouchDown)
self.addTarget(self, action: "touchUpInside:", forControlEvents: UIControlEvents.TouchUpInside)
self.addTarget(self, action: "touchDragExit:", forControlEvents: UIControlEvents.TouchDragExit)
self.addTarget(self, action: "touchDragEnter:", forControlEvents: UIControlEvents.TouchDragEnter)
self.addTarget(self, action: "touchCancel:", forControlEvents: UIControlEvents.TouchCancel)
to:
self.addTarget(self, action: #selector(DOFavoriteButton.touchDown(:)), forControlEvents: UIControlEvents.TouchDown)
self.addTarget(self, action: #selector(DOFavoriteButton.touchUpInside(:)), forControlEvents: UIControlEvents.TouchUpInside)
self.addTarget(self, action: #selector(DOFavoriteButton.touchDragExit(:)), forControlEvents: UIControlEvents.TouchDragExit)
self.addTarget(self, action: #selector(DOFavoriteButton.touchDragEnter(:)), forControlEvents: UIControlEvents.TouchDragEnter)
self.addTarget(self, action: #selector(DOFavoriteButton.touchCancel(_:)), forControlEvents: UIControlEvents.TouchCancel)
But updating the selectors will result in my app crashing giving me the error:
libc++abi.dylib: terminating with uncaught exception of type NSException
[Test.DOFavoriteButton select:]: unrecognized selector sent to instance 0x7fea9ad6f480
2016-03-29 23:07:17.286 Test[16889:2397051] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Test.DOFavoriteButton select:]: unrecognized selector sent to instance 0x7fea9ad6f480'
Thanks for greate library.
I use DOFavoriteButton to UITableViewCell. And I use autolayout.
I change the button image per cell, because each cell have each state.
Then, it takes long time to display the button.
Do you have any idea?
this is snnipet of set data to cell.
func setPostData(post: Post) {
self.post = post
if post.myLikeCount < 5 {
likeIconImageView.imageColorOff = UIColor.myPinkColor()
likeIconImageView.image = UIImage(named: "fav")
}
else {
likeIconImageView.imageColorOff = UIColor.mySecondaryColor()
likeIconImageView.image = UIImage(named: "fav_disabled")
}
}
First off, thanks so much for doing this. Can you please add a method to change the size of the button?
Hey. If the button is being tapped and its state is "on" it makes some weird blue color on upper left corner of the button. What could cause this? I am using the Swift 3 file manually version.
Illustration of what is happening is here.
I Need all it's work on every time.. and When i Click the Like DOFavoriteButton the Profile image also Has to be blinked... The Profile Image Getting blinked into After the Code Convention in Swift 3.0
Please make this package available via Carthage
This Library is not compatible with the latest versions of swift
I'd like to use the button title label to show a counter of likes right aligned to the image. But it seems that it's disregarding the constraints and insets we use from the storyboard, in other words, the image is always fixed in the middle of the button.
How can we have the image and the label working together to achieve this goal?
First off, thanks for sharing this!
Is there a way to change the image size? Increasing the button size does not work.
I want to implement this button into UIBarButtonItem, is it possible to do that?
Hi,
I have a heart/Like not filled just path and when the heart is selected by user, I want to fill it while the original image provided is not filled (just a path).
Is there any way to achieve this to simulate something similar to Apple Store favourites?
Cheers,
adam
Does not compile in latest Xcode
Hi,
As you know swift 2.3 project is not working on swift 3.0 . Can you make this project on swift 3.0,So that we can use it.
Thanks
Vikas
Hey. I do not seem to find a way to keep the button state if user has changed view or terminated the app? I think it is even harder if buttons are in tableview? For example if you use it with Firebase with this code:
func likeSystem(sender: DOFavoriteButton, cellForRowAt indexPath: IndexPath){
if sender.isSelected {
let cell = tableView.dequeueReusableCell(withIdentifier: "snusProductsCell", for: indexPath) as! SnusProductTableViewCell
self.databaseRef.child("Snuses").child(self.products[indexPath.row].snusProductTitle).runTransactionBlock({
(currentData:FIRMutableData!) -> FIRTransactionResult in
if var post = currentData.value as? [String : AnyObject], let uid = FIRAuth.auth()?.currentUser?.uid {
var stars : Dictionary<String, Bool>
stars = post["likes"] as? [String : Bool] ?? [:]
var starCount = post["hasLiked"] as? Int ?? 0
if let _ = stars[uid] {
// Unstar the post and remove self from stars
starCount -= 1
stars.removeValue(forKey: uid)
} else {
// Star the post and add self to stars
starCount += 1
stars[uid] = true
sender.deselect()
}
post["raters"] = starCount as AnyObject?
post["hasLiked"] = stars as AnyObject?
// Set value and report transaction success
currentData.value = post
return FIRTransactionResult.success(withValue: currentData)
}
return FIRTransactionResult.success(withValue: currentData)
}) { (error, committed, snapshot) in
if let error = error {
print(error.localizedDescription)
}
}
}else{
sender.select()
}
}
Hi vicorente,
when loading the tableview the heart is getting animated Everytime there is any way to restrict it
how can i use in object-c,thanks
I'm wondering, are you going to port this to Swift 2.0?
Different code between github and pod
Hi @okmr-d
First of all thank you for this fantastic repository!
I downloaded it and implemented it in my project, which is written in Objective C. I've inserted a button via storyboard and assigned it the DOFavoriteButton class. Everything seems to work fine but when i tap on it nothing happen.
Is there any objective c issue or extra step i should know?
Thank you again
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.