在Swift中调用Draw函数

时间:2015-07-04 13:13:08

标签: ios swift graphics

我的Draw2D类中有以下代码,它附加到viewcontroller中的视图。

在viewcontroller中我有一个var Drawing = Draw2D()。我有一个连接按钮,执行功能"检查"与self.Drawing.Check()。问题是我无法在屏幕上显示该行。椭圆工作正常,功能检查表现良好,我可以看到println()。 有什么问题?

import UIKit

class Draw2D: UIView {

    override func drawRect(rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()
        CGContextSetLineWidth(context, 4.0)
        CGContextSetStrokeColorWithColor(context, UIColor.blueColor().CGColor)
        let rectangle = CGRectMake(60,170,200,80)
        CGContextAddEllipseInRect(context, rectangle)
        CGContextStrokePath(context)
    }

    func Check() {
        let context = UIGraphicsGetCurrentContext()
        CGContextSetLineWidth(context, 2.0)
        CGContextMoveToPoint(context, CGFloat(100), CGFloat(300))
        CGContextAddLineToPoint(context, CGFloat(100 + 200), CGFloat(300 + 100))
        CGContextStrokePath(context)
    }
}

1 个答案:

答案 0 :(得分:1)

您对Check()的调用超出了常规呈现循环 - 我真的不知道UIGraphicsGetCurrentContext()在这种情况下实际返回了什么。我猜它会返回nil

  

默认情况下,当前图形上下文为零。在调用drawRect:方法之前,视图对象将有效的上下文推送到堆栈,使其成为当前。

无论如何,这不会改变你不能只调用Check()并期望渲染线的事实。假设该行实际呈现了一秒:在下一次渲染迭代中,您再次只会执行drawRect内所写的内容,因此不再显示该行。

您需要做的是在drawRect内创建某种逻辑,以确定是否可以调用Check()

执行此操作的可能方法如下:

class Draw2D: UIView {

    var callCheck:Bool? // changing it to Bool! or Bool will change the required check a few lines below

    override func drawRect(rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()
        CGContextSetLineWidth(context, 4.0)
        CGContextSetStrokeColorWithColor(context, UIColor.blueColor().CGColor)
        let rectangle = CGRectMake(60,170,200,80)
        CGContextAddEllipseInRect(context, rectangle)
        CGContextStrokePath(context)
        if callCheck != nil && callCheck! {
            Check()
        }
    }

    func Check() {
        let context = UIGraphicsGetCurrentContext()
        CGContextSetLineWidth(context, 2.0)
        CGContextMoveToPoint(context, CGFloat(100), CGFloat(300))
        CGContextAddLineToPoint(context, CGFloat(100 + 200), CGFloat(300 + 100))
        CGContextStrokePath(context)
    }
}

更改IBAction

@IBAction func Button1(sender: AnyObject) { 
    self.Drawing.callCheck = true
    self.Drawing.setNeedsDisplay() 
}