你也可以繼承的UIButton並繪製在drawRect中創建一個子類像這樣:
import UIKit
class CustomButtonTopGreen: UIButton {
let cornerRadius:CGFloat = 20.0
let borderLineWidth:CGFloat = 2.0
var bezierPath:UIBezierPath = UIBezierPath()
var gradientLayer:CAGradientLayer = CAGradientLayer()
var bottomLayer:UInt32 = 0
override func drawRect(rect: CGRect) {
if self.state != UIControlState.Highlighted
{
self.drawBorder()
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = self.bounds
gradient.colors = [self.UIColorFromRGB(0xb1ffb1).CGColor, self.UIColorFromRGB(0xe7e7e7).CGColor]
self.gradientLayer = gradient
let mask = CAShapeLayer();
mask.frame = self.bounds;
mask.path = self.bezierPath.CGPath;
mask.fillColor = UIColor.blackColor().CGColor;
mask.strokeColor = UIColor.blackColor().CGColor;
gradient.mask = mask;
let shape = CAShapeLayer();
shape.path = self.bezierPath.CGPath
shape.lineWidth = borderLineWidth
shape.strokeColor = UIColor.lightGrayColor().CGColor
shape.fillColor = UIColor.clearColor().CGColor
self.gradientLayer.removeFromSuperlayer()
self.layer.insertSublayer(gradient, atIndex: bottomLayer)
self.layer.addSublayer(shape)
self.bottomLayer++
}else{
self.drawBorder()
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = self.bounds
gradient.colors = [self.UIColorFromRGB(0x717171).CGColor, self.UIColorFromRGB(0xacacac).CGColor]
self.gradientLayer = gradient
let mask = CAShapeLayer();
mask.frame = self.bounds;
self.bezierPath.lineWidth = 4.0
mask.path = self.bezierPath.CGPath;
mask.fillColor = UIColor.blackColor().CGColor;
mask.strokeColor = UIColor.blackColor().CGColor;
gradient.mask = mask;
let shape = CAShapeLayer();
shape.path = self.bezierPath.CGPath
shape.lineWidth = borderLineWidth
shape.strokeColor = UIColor.lightGrayColor().CGColor
shape.fillColor = UIColor.clearColor().CGColor
self.gradientLayer.removeFromSuperlayer()
self.layer.insertSublayer(gradient, atIndex: bottomLayer)
self.layer.addSublayer(shape)
self.bottomLayer++
}
}
func drawBorder(){
let path: UIBezierPath = UIBezierPath()
path.moveToPoint(CGPoint(x: borderLineWidth, y: self.bounds.size.height-borderLineWidth))
path.addLineToPoint(CGPoint(x: borderLineWidth, y: cornerRadius+borderLineWidth))
path.addQuadCurveToPoint(CGPoint(x: cornerRadius+borderLineWidth, y: borderLineWidth), controlPoint:CGPoint(x:borderLineWidth, y:borderLineWidth))
path.addLineToPoint(CGPoint(x: self.bounds.size.width-cornerRadius-borderLineWidth, y: borderLineWidth))
path.addQuadCurveToPoint(CGPoint(x: self.bounds.size.width-borderLineWidth, y: cornerRadius+borderLineWidth), controlPoint: CGPointMake(self.bounds.size.width-borderLineWidth, borderLineWidth))
path.addLineToPoint(CGPoint(x: self.bounds.size.width-borderLineWidth, y: self.bounds.size.height-borderLineWidth))
path.closePath()
path.lineWidth = borderLineWidth
self.bezierPath = path
}
func UIColorFromRGB(rgbValue: UInt) -> UIColor {
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16)/255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8)/255.0,
blue: CGFloat(rgbValue & 0x0000FF)/255.0,
alpha: CGFloat(1.0)
)
}
override var highlighted: Bool {
didSet {
self.setNeedsDisplay()
}
}
}
你應該找出與高亮gradientLayer代替正常gradientLayer一個更好的方式,但它的工作原理是是。
最簡單的方法是Photoshop的圖像,並將其用作按鈕的背景圖像! –
這實際上是我現在擁有的,問題是我希望我的按鈕看起來儘可能與Android版本中的按鈕完全相同(全部都是在代碼中完成的)。我不確定,也許我有點過度強迫它。 –
你是不是隻需要在android中截取你的按鈕,並將其轉換爲所需大小的圖像? –