ios在屏幕上绘图

时间:2015-01-25 09:39:06

标签: ios swift

所以,作为一个快速的新手,我正在四处寻找并随时学习。通常一点google foo或教程会帮助我,但现在我很难过。所以,如果有人能向我解释这一点,我会非常高兴。 所以我试图在屏幕上画一个圆圈,好吧,实际上是其中一些。我在网上找到了这个代码;

http://www.ioscreator.com/tutorials/drawing-circles-uitouch-ios8-swift

import UIKit
class CircleView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.clearColor()
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func drawRect(rect: CGRect) {
        var context = UIGraphicsGetCurrentContext();
        //... various stuff to draw a circle ..//
    }
}

这是一个像这样初始化时绘制圆圈的类

currentCircle = CircleView(frame: CGRectMake(0,0,100,100 ) )

我有几个问题。

为什么它实际画圆圈? drawRect函数永远不会被直接调用。我想这是因为我们在UIView中覆盖了一个函数,我还不理解这些概念。

如何将变量传递给该函数的初始化?说,我想绘制不同厚度的圆圈,我想传递一个额外的变量:

currentCircle = CircleView(frame: CGRectMake(0,0,100,100 ), thickness:10  )

如何修改init以接受此操作?像这样添加它:

override init(frame: CGRec, thickness: Int) {
    super.init(frame: frame)
}

触发错误(初始化程序确实从其超类覆盖指定的初始化程序)

为什么所有的覆盖?我试过让它成为一个类并使用代码绘制。然而,

CGContextAddArc

触发编译器错误,说上下文无效,所以我想

UIGraphicsGetCurrentContext()

没有返回任何有用的东西。

或者如果有人知道一个有用的资源,我可以学习更多关于覆盖和初始化类的知识,那将是受欢迎的。

2 个答案:

答案 0 :(得分:0)

  

为什么它实际上画了一个圆圈?

你没有直接拨打drawRect:,这是对的。当需要重新绘制视图时,系统会调用它。例如,当视图的边界发生变化,或者您调用setNeedsDisplay()

时,就会发生这种情况
  

我如何修改init ...

你的init应该是这样的:

convenience init(frame: CGRec, thickness: Int) {
    self.thickness = thickness
    self.init(frame: frame)
}

您只能覆盖班级超类中的方法,init(frame: CGRec, thickness: Int)不是其中之一。

在开始教程之前,您应该花些时间阅读Apple's Swift documentation。所有你需要了解的语言都在那里。

有关绘图的详细信息,请参阅定义自定义视图here.

答案 1 :(得分:0)

一种优雅的方法是将您的视图转换为具有完整Interface Builder支持的类。这样,您就可以在Interface Builder中直接添加和配置视图实例。

使用自定义视图:

  • 选择并插入视图
  • Identity Inspector 视图中,将自定义类属性设置为您的类名(CircleView)
  • 属性检查器视图中,设置厚度

您需要对代码进行一些修改,尤其是注释@IBDesignable@IBInspectable

import UIKit

@IBDesignable class CircleView: UIView {

    @IBInspectable var thickness: CGFloat = 1

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func drawRect(rect: CGRect) {
        var context = UIGraphicsGetCurrentContext()
        CGContextSetLineWidth(context, thickness)
        var r = self.bounds
        var ellipseRect = CGRectMake(r.origin.x + self.thickness / 2, r.origin.y + self.thickness / 2,
            r.size.width - thickness, r.size.height - thickness)
        CGContextStrokeEllipseInRect(context, ellipseRect)
    }
}

是的,你是对的。你永远不会打电话给'drawRect:'你自己。您可以在屏幕上添加视图实例,iOS会调用' drawRect:'什么时候需要画出你的观点。

它是图形用户界面系统的整体模式:您主要对诸如用户点击或重新绘制事件等事件做出反应。