不正确地使用 Core Graphics
Incorrectly using Core Graphics
我正在尝试通过创建扩展 UIControl 的 class 来制作自定义 UISlider。我在尝试使用核心图形填充和描边 CGRects 时遇到问题。我能够在位置 (0,0) 正确地描边和填充 CGRect,但不能在任何其他位置。
这是我在 (0,0) 处绘制 UISlider 时看到的内容
这是我在 (%10,%10) 处绘制 UISlider 时看到的内容
我的滑块是在 AppDelegate 中制作的
var slider:RGBSlider
slider = RGBSlider(frame: CGRectMake(bounds.width * 0.1, bounds.height * 0.1, bounds.width * 0.6, bounds.height * 0.15), leftColor: UIColor.blackColor(), rightColor: UIColor.redColor())
这里是 class 声明:
class RGBSlider: UIControl
{
//member vars
private var _sliderRec: CGRect = CGRectZero
private var _cursorRec: CGRect = CGRectZero
private var _gradient: CAGradientLayer
//initlizer
init(frame: CGRect, leftColor: UIColor, rightColor: UIColor)
{
_sliderRec = frame
//and this does not
//_sliderRec.origin.x = frame.origin.x
//_sliderRec.origin.y = frame.origin.y
//this works for some reason
//_sliderRec.origin.x = 0
//_sliderRec.origin.y = 0
_gradient = CAGradientLayer()
_gradient.colors = [leftColor, rightColor]
_gradient.locations = [0.0, 255.0]
super.init(frame: _sliderRec)
}
required init(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
//defines how to draw the slider
override func drawRect(rect: CGRect)
{
let context: CGContext! = UIGraphicsGetCurrentContext()
let strokeSize:Float = 3.0
var smallerRec = CGRectMake( _sliderRec.origin.x + CGFloat(strokeSize/2), _sliderRec.origin.y + CGFloat(strokeSize/2), (_sliderRec.size.width - CGFloat(strokeSize)), (_sliderRec.size.height - CGFloat(strokeSize)) )
//fills the rectangle
CGContextAddRect(context, smallerRec)
CGContextSetFillColorWithColor(context, UIColor.whiteColor().CGColor)
CGContextDrawPath(context, kCGPathFill)
//stroke in the rectangle
CGContextAddRect(context, _sliderRec)
CGContextSetStrokeColorWithColor(context, _gradient.colors[1].CGColor)
CGContextStrokeRectWithWidth(context, _sliderRec, CGFloat(strokeSize))
CGContextStrokeRect(context, _sliderRec)
CGContextDrawPath(context, kCGPathStroke)
}
}
为什么我的滑块不在我的 CGRect 的原点,但它不在原点?我怎样才能解决这个问题?谢谢!
尝试在 drawRect 中使用 bounds
代替 _sliderRec
。 _sliderRec
是视图的框架,它是它在父视图中的位置。在视图中绘图时,您需要使用视图的 bounds
属性。
我正在尝试通过创建扩展 UIControl 的 class 来制作自定义 UISlider。我在尝试使用核心图形填充和描边 CGRects 时遇到问题。我能够在位置 (0,0) 正确地描边和填充 CGRect,但不能在任何其他位置。
这是我在 (0,0) 处绘制 UISlider 时看到的内容
这是我在 (%10,%10) 处绘制 UISlider 时看到的内容
我的滑块是在 AppDelegate 中制作的
var slider:RGBSlider
slider = RGBSlider(frame: CGRectMake(bounds.width * 0.1, bounds.height * 0.1, bounds.width * 0.6, bounds.height * 0.15), leftColor: UIColor.blackColor(), rightColor: UIColor.redColor())
这里是 class 声明:
class RGBSlider: UIControl
{
//member vars
private var _sliderRec: CGRect = CGRectZero
private var _cursorRec: CGRect = CGRectZero
private var _gradient: CAGradientLayer
//initlizer
init(frame: CGRect, leftColor: UIColor, rightColor: UIColor)
{
_sliderRec = frame
//and this does not
//_sliderRec.origin.x = frame.origin.x
//_sliderRec.origin.y = frame.origin.y
//this works for some reason
//_sliderRec.origin.x = 0
//_sliderRec.origin.y = 0
_gradient = CAGradientLayer()
_gradient.colors = [leftColor, rightColor]
_gradient.locations = [0.0, 255.0]
super.init(frame: _sliderRec)
}
required init(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
//defines how to draw the slider
override func drawRect(rect: CGRect)
{
let context: CGContext! = UIGraphicsGetCurrentContext()
let strokeSize:Float = 3.0
var smallerRec = CGRectMake( _sliderRec.origin.x + CGFloat(strokeSize/2), _sliderRec.origin.y + CGFloat(strokeSize/2), (_sliderRec.size.width - CGFloat(strokeSize)), (_sliderRec.size.height - CGFloat(strokeSize)) )
//fills the rectangle
CGContextAddRect(context, smallerRec)
CGContextSetFillColorWithColor(context, UIColor.whiteColor().CGColor)
CGContextDrawPath(context, kCGPathFill)
//stroke in the rectangle
CGContextAddRect(context, _sliderRec)
CGContextSetStrokeColorWithColor(context, _gradient.colors[1].CGColor)
CGContextStrokeRectWithWidth(context, _sliderRec, CGFloat(strokeSize))
CGContextStrokeRect(context, _sliderRec)
CGContextDrawPath(context, kCGPathStroke)
}
}
为什么我的滑块不在我的 CGRect 的原点,但它不在原点?我怎样才能解决这个问题?谢谢!
尝试在 drawRect 中使用 bounds
代替 _sliderRec
。 _sliderRec
是视图的框架,它是它在父视图中的位置。在视图中绘图时,您需要使用视图的 bounds
属性。