【问题标题】:Swift 3: Drawing a rectangleSwift 3:绘制一个矩形
【发布时间】:2016-10-28 19:36:06
【问题描述】:

我是 Swift 的 3 天新手,我正在尝试弄清楚如何绘制一个矩形。我对这门语言太陌生了,不知道要扩展的类和要覆盖的方法,我四处寻找示例代码,但似乎没有任何效果(我将其归因于我对 swift 3 的使用)。

我现在正在尝试的是:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


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

        k.draw(CGRect(
            origin: CGPoint(x: 50, y: 50),
            size: CGSize(width: 100, height: 100)));
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
class Draw: UIView {

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

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

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

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

        color.set()
        bpath.stroke()

        print("it ran")

        NSLog("drawRect has updated the view")

    }

}

这并没有做任何事情。帮助。

【问题讨论】:

  • 如果您刚刚开始,那么在 Stack Overflow 上提出此类广泛的问题并不是您需要的地方。您应该找到一本好书或一系列在线教程。看看Good resources for learning ObjC;它包括 iOS 的参考资料,此时大部分材料都已针对 Swift 进行了更新。祝你好运!
  • 1.千万不要自己打电话给draw。 2. 只需调用view.addSubview(k) 将视图添加到您的视图层次结构中,操作系统会在需要时为您调用draw 方法。

标签: swift graphics draw drawrect swift3


【解决方案1】:

为了查看视图,您需要创建一个视图并为其设置框架,以便它知道要制作多大。

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

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

您将能够单击右侧的快速查看,然后您将看到该视图。


您还可以在ViewController 中将视图添加为view 的子视图,然后您将在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 调用它来显示视图。

【讨论】:

  • 我收到错误:在范围内找不到“绘图”
【解决方案2】:

创建一个类,我把它放在一个单独的 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 上运行:

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

【讨论】:

  • 来自draw(_:) 文档:- 你永远不应该自己直接调用这个方法。要使视图的一部分无效,从而导致该部分被重绘,请改为调用 setNeedsDisplay()setNeedsDisplay(_:) 方法。
【解决方案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)
        }
    }

【讨论】:

    【解决方案4】:

    关于如何使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-06
      • 2013-09-03
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多