|
import UIKit |
|
|
|
class ViewController: UIViewController { |
|
|
|
var label:ToolTip! |
|
var labelTransform:CGAffineTransform! |
|
let buttonHeight:CGFloat = 100 |
|
let buttonWidth:CGFloat = 200 |
|
|
|
override func viewDidLoad() { |
|
super.viewDidLoad() |
|
|
|
let button = UIButton() |
|
button.setTitle("Push Me", forState: .Normal) |
|
button.addTarget(self, action: Selector("buttonPushed"), forControlEvents: .TouchUpInside) |
|
button.backgroundColor = UIColor.orangeColor() |
|
view.addSubview(button) |
|
button.translatesAutoresizingMaskIntoConstraints = false |
|
button.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true |
|
button.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true |
|
button.heightAnchor.constraintEqualToConstant(buttonHeight).active = true |
|
button.widthAnchor.constraintEqualToConstant(buttonWidth).active = true |
|
|
|
label = ToolTip() |
|
|
|
view.insertSubview(label, belowSubview: button) |
|
label.translatesAutoresizingMaskIntoConstraints = false |
|
label.heightAnchor.constraintEqualToConstant(buttonHeight).active = true |
|
label.widthAnchor.constraintEqualToConstant(buttonWidth).active = true |
|
|
|
|
|
label.bottomAnchor.constraintEqualToAnchor(button.topAnchor).active = true |
|
label.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true |
|
label.text = "This button is orange!" |
|
label.textColor = UIColor.whiteColor() |
|
label.textAlignment = .Center |
|
let trans1 = CGAffineTransformMakeScale(0, 0) |
|
let trans2 = CGAffineTransformMakeTranslation(0, buttonHeight) |
|
labelTransform = CGAffineTransformConcat(trans1, trans2) |
|
label.transform = labelTransform |
|
|
|
} |
|
|
|
func buttonPushed() { |
|
|
|
if label.transform.ty > 0 { |
|
UIView.animateWithDuration(0.75, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5, options: .CurveEaseInOut, animations: { () -> Void in |
|
|
|
self.label.transform = CGAffineTransformIdentity |
|
|
|
}, completion: nil) |
|
|
|
} |
|
else { |
|
UIView.animateWithDuration(0.5, delay: 0, options: .CurveEaseInOut, animations: { () -> Void in |
|
self.label.alpha = 0 |
|
|
|
}, completion: {_ in |
|
self.label.transform = self.labelTransform |
|
self.label.alpha = 1 |
|
}) } |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
class ToolTip: UILabel { |
|
var roundRect:CGRect! |
|
override func drawTextInRect(rect: CGRect) { |
|
super.drawTextInRect(roundRect) |
|
} |
|
override func drawRect(rect: CGRect) { |
|
roundRect = CGRect(x: rect.minX, y: rect.minY, width: rect.width, height: rect.height * 4 / 5) |
|
let roundRectBez = UIBezierPath(roundedRect: roundRect, cornerRadius: 10.0) |
|
let triangleBez = UIBezierPath() |
|
triangleBez.moveToPoint(CGPoint(x: roundRect.minX + roundRect.width / 2.5, y:roundRect.maxY)) |
|
triangleBez.addLineToPoint(CGPoint(x:rect.midX,y:rect.maxY)) |
|
triangleBez.addLineToPoint(CGPoint(x: roundRect.maxX - roundRect.width / 2.5, y:roundRect.maxY)) |
|
triangleBez.closePath() |
|
roundRectBez.appendPath(triangleBez) |
|
let bez = roundRectBez |
|
UIColor.lightGrayColor().setFill() |
|
bez.fill() |
|
super.drawRect(rect) |
|
} |
|
} |
This code was written in response to a StackOverflow question. I'm posting it here to keep my own record.
