我对Swift非常陌生。我正在尝试在Swift中的UIView上绘制网格(如图形页面)。该代码正在运行,但是我看不到任何行。我看不到我做错了。
在情节提要中,我在ViewController上添加了一个视图。
在代码中,我创建了GridView.swift并将其添加到上面的视图中。这是GridView类的代码。正在调用函数draw,并且代码运行无任何错误。它只是按照我的想法去做。
甚至都没有画一条线(我删除了for循环,只想画一条线)。这似乎很基础,应该可以使用。
import Foundation
import UIKit
class GridView: UIView
{
fileprivate var gridWidthMultiple: CGFloat
{
return 10
}
fileprivate var gridHeightMultiple : CGFloat
{
return 20
}
fileprivate var gridWidth: CGFloat
{
return bounds.width/CGFloat(gridWidthMultiple)
}
fileprivate var gridHeight: CGFloat
{
return bounds.height/CGFloat(gridHeightMultiple)
}
fileprivate var gridCenter: CGPoint {
return CGPoint(x: bounds.midX, y: bounds.midY)
}
fileprivate func drawGrid()
{
let path = UIBezierPath()
path.lineWidth = 5.0
for index in 1...Int(gridWidthMultiple) - 1
{
let start = CGPoint(x: CGFloat(index) * gridWidth, y: 0)
let end = CGPoint(x: CGFloat(index) * gridWidth, y:bounds.height)
path.move(to: start)
path.addLine(to: end)
}
}
override func draw(_ rect: CGRect)
{
drawGrid()
}
}
只需复制并粘贴以下代码,您就可以开始了。我没有检查您绘制正确网格的逻辑,我刚刚解决了不绘制问题。如果它绘制了错误的网格,那么我现在将重新检查您的网格逻辑,它仅可以帮助您使用UIBezierPath
class GridView: UIView
{
private var path = UIBezierPath()
fileprivate var gridWidthMultiple: CGFloat
{
return 10
}
fileprivate var gridHeightMultiple : CGFloat
{
return 20
}
fileprivate var gridWidth: CGFloat
{
return bounds.width/CGFloat(gridWidthMultiple)
}
fileprivate var gridHeight: CGFloat
{
return bounds.height/CGFloat(gridHeightMultiple)
}
fileprivate var gridCenter: CGPoint {
return CGPoint(x: bounds.midX, y: bounds.midY)
}
fileprivate func drawGrid()
{
path = UIBezierPath()
path.lineWidth = 5.0
for index in 1...Int(gridWidthMultiple) - 1
{
let start = CGPoint(x: CGFloat(index) * gridWidth, y: 0)
let end = CGPoint(x: CGFloat(index) * gridWidth, y:bounds.height)
path.move(to: start)
path.addLine(to: end)
}
for index in 1...Int(gridHeightMultiple) - 1 {
let start = CGPoint(x: 0, y: CGFloat(index) * gridHeight)
let end = CGPoint(x: bounds.width, y: CGFloat(index) * gridHeight)
path.move(to: start)
path.addLine(to: end)
}
//Close the path.
path.close()
}
override func draw(_ rect: CGRect)
{
drawGrid()
// Specify a border (stroke) color.
UIColor.purple.setStroke()
path.stroke()
}
}
如果您想在初始化视图时进行绘制逻辑,但是实际上您想稍后绘制线条,即发生某些特殊事件时。贝娄类有两种方法drawGridWithStoreColor
和removeGrid
,这将帮助您在需要时绘制网格,并在需要时删除网格。
class GridView: UIView
{
private var path = UIBezierPath()
var gridLayer: CAShapeLayer?
fileprivate var gridWidthMultiple: CGFloat
{
return 10
}
fileprivate var gridHeightMultiple : CGFloat
{
return 20
}
fileprivate var gridWidth: CGFloat
{
return bounds.width/CGFloat(gridWidthMultiple)
}
fileprivate var gridHeight: CGFloat
{
return bounds.height/CGFloat(gridHeightMultiple)
}
fileprivate var gridCenter: CGPoint {
return CGPoint(x: bounds.midX, y: bounds.midY)
}
fileprivate func drawGrid()
{
path = UIBezierPath()
path.lineWidth = 5.0
for index in 1...Int(gridWidthMultiple) - 1
{
let start = CGPoint(x: CGFloat(index) * gridWidth, y: 0)
let end = CGPoint(x: CGFloat(index) * gridWidth, y:bounds.height)
path.move(to: start)
path.addLine(to: end)
}
}
//Call this method with your stroke color when you want to draw this grid
func drawGridWithColor(borderColor: UIColor) {
//Close the path.
path.close()
if gridLayer == nil {
gridLayer = CAShapeLayer()
gridLayer?.lineWidth = 5.0;
gridLayer?.path = path.cgPath
gridLayer?.strokeColor = borderColor.cgColor
self.layer.addSublayer(gridLayer!)
//Above line will add this grid at the very top of this view.
// if you want to add this grid below some layer/object you can use method
//self.layer.insertSublayer(gridLayer, at: 0)
//Give the index number to this method so that it can place this grid at the index
}else {
gridLayer?.strokeColor = borderColor.cgColor
}
}
func removeGrid() {
guard let gLayer = gridLayer else {return}
gLayer.removeFromSuperlayer()
}
override func draw(_ rect: CGRect)
{
drawGrid()
}
}