Skip to main content
 首页 » 操作系统

swift之不正确地使用 Core Graphics

2024年01月01日34dudu

我正在尝试通过创建一个扩展 UIControl 的类来制作自定义 UISlider。我在尝试使用核心图形填充和描边 CGRects 时遇到问题。我能够在位置 (0,0) 正确地描边和填充 CGRect,但不能在任何其他位置。

这是我在 (0,0) 处绘制 UISlider 时看到的内容

这是我在 (%10,%10) 处绘制 UISlider 时看到的内容

我的 slider 是在 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 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) 
 
 
} 

为什么我的 slider 不在我的 CGRect 的原点,但它不在原点?我怎样才能解决这个问题?谢谢!

请您参考如下方法:

尝试在 drawRect 中使用 bounds 代替 _sliderRec。 _sliderRec 是 View 的框架,它是它在父 View 中的位置。在 View 中绘图时,您需要改用 View 的 bounds 属性。