不正确地使用 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 属性。