Swift 3:绘制一个矩形

时间:2016-06-26 20:35:12

标签: swift graphics draw drawrect swift3

我快3天了,我正在试图弄清楚如何画一个矩形。我对语言太新了,不知道要扩展的类和覆盖的方法,我已经四处寻找示例代码,但似乎没有任何工作(我将其归因于我的使用)迅捷3)。

我现在尝试的是:

{{1}}

那没有做任何事情。帮助

4 个答案:

答案 0 :(得分:14)

为了查看视图,您需要创建一个并给它一个框架,以便它知道它有多大。

如果您将代码放在Playground中,然后添加以下行:

let d = Draw(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

您可以点击右侧的快速查看,然后您将看到该视图。

Yellow square in a playground

您还可以在view中将视图添加为ViewController的子视图,然后您将在iPhone上看到它:

override func viewDidLoad() {
    super.viewDidLoad()

    let k = Draw(frame: CGRect(
        origin: CGPoint(x: 50, y: 50),
        size: CGSize(width: 100, height: 100)))

    // Add the view to the view hierarchy so that it shows up on screen
    self.view.addSubview(k)
}

请注意,您绝不会直接致电draw(_:)。它由 Cocoa Touch 为您调用以显示视图。

Yellow square on iPhoneSE

答案 1 :(得分:7)

创建一个类,我把它放在一个单独的Swift 3文件中。

//
//  Plot_Demo.swift
//
//  Storyboard is not good in creating self adapting UI
//  Plot_Demo creates the drawing programatically.

import Foundation
import UIKit

public class Plot_Demo: UIView
{
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

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

    public override func draw(_ frame: CGRect) {
        let h = frame.height
        let w = frame.width
        let color:UIColor = UIColor.yellow

        let drect = CGRect(x: (w * 0.25), y: (h * 0.25), width: (w * 0.5), height: (h * 0.5))
        let bpath:UIBezierPath = UIBezierPath(rect: drect)

        color.set()
        bpath.stroke()

        print("it ran")
        NSLog("drawRect has updated the view")
    }
}

UIViewController对象中使用的示例:

override func viewDidLoad() {
    super.viewDidLoad()

    // Instantiate a new Plot_Demo object (inherits and has all properties of UIView)
    let k = Plot_Demo(frame: CGRect(x: 75, y: 75, width: 150, height: 150))

    // Put the rectangle in the canvas in this new object
    k.draw(CGRect(x: 50, y: 50, width: 100, height: 100))

    // view: UIView was created earlier using StoryBoard
    // Display the contents (our rectangle) by attaching it
    self.view.addSubview(k)
}

在iPhone模拟器和iPhone上运行:

enter image description here

使用的XCode版本8.0(8A218a),Swift 3,目标iOS 10.0

答案 2 :(得分:3)

这是绘制矩形的另一种方法,

第1步:获取给定点的矩形路径

(注意:arrPathPoints必须为4才能绘制矩形),

func getPathPayer(arrPathPoints:[CGPoint]) throws -> CAShapeLayer {
        enum PathError : Error{
            case moreThan2PointsNeeded
        }

        guard arrPathPoints.count > 2 else {
            throw PathError.moreThan2PointsNeeded
        }

        let lineColor = UIColor.blue
        let lineWidth: CGFloat = 2
        let path = UIBezierPath()
        let pathLayer = CAShapeLayer()

        for (index,pathPoint) in arrPathPoints.enumerated() {
            switch index {
            //First point
            case 0:
                path.move(to: pathPoint)

            //Last point
            case arrPathPoints.count - 1:
                path.addLine(to: pathPoint)
                path.close()

            //Middle Points
            default:
                path.addLine(to: pathPoint)
            }
        }

        pathLayer.path = path.cgPath
        pathLayer.strokeColor = lineColor.cgColor
        pathLayer.lineWidth = lineWidth
        pathLayer.fillColor = UIColor.clear.cgColor

        return pathLayer
    }

第2步:使用,调用此类方法,

override func viewDidLoad() {
        super.viewDidLoad()

        do {
            let rectangleLayer = try getPathPayer(arrPathPoints: [
                CGPoint(x: 110, y: 110),    //Top-Left
                CGPoint(x: 130, y: 110),    //Top-Right
                CGPoint(x: 130, y: 130),    //Bottom-Right
                CGPoint(x: 110, y: 130)])   //Bottom-Left
            view.layer.addSublayer(rectangleLayer)
        } catch {
            debugPrint(error)
        }
    }

答案 3 :(得分:1)

我使用Swift 5绘制矩形的版本。

首先创建一个类进行绘制。它使用CoreGraphics而不是UIKit来绘制图形。

import UIKit

class DrawRectangle: UIView {

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

    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func draw(_ rect: CGRect) {

        guard let context = UIGraphicsGetCurrentContext() else {
            print("could not get graphics context")
            return
        }

        context.setStrokeColor(UIColor.yellow.cgColor)
        context.setLineWidth(2)
        context.stroke(rect.insetBy(dx: 10, dy: 10))
    }
}

然后将其放入ViewController的viewDidLoad()

    let myView = DrawRectangle(frame: CGRect(x: 50, y: 50, width: 100, height: 100))

    self.view.addSubview(myView)