UIBezierPath的快速替代方法,用于将大量方块绘制到自定义视图中

时间:2016-01-10 06:25:57

标签: ios swift uibezierpath

我正在制作一个能够绘制基本细胞自动机的应用程序。目前我正在使用UIBezierPath在自定义UIView中绘制单元格:

 var path : UIBezierPath
    for (heightIndex, row) in stateMatrix!.enumerate() {
        for (widthIndex, cell) in row!.enumerate() {

            let myRect = CGRect(x: cellWidth * CGFloat(widthIndex), y: cellWidth * CGFloat(heightIndex), width: cellWidth, height: cellWidth)

            path = UIBezierPath(rect: myRect)
            if cell == "x" {
                Constants.OnColor.setFill()
                Constants.OnColor.setStroke()
            } else {
                Constants.OffColor.setFill()
                Constants.OffColor.setStroke()
            }
            path.fill()
            path.stroke()
        }
    }

我正在绘制的网格大约是n * 6n个单元格。当n很小时,这个代码工作正常,但它显然不能很好地扩展(在我的iPhone 4s上,n = 150,大约需要一分半钟)。显然,必须有一个更好的方法来做到这一点,而不是调用UIBezierPath几十万次。什么是更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您为什么使用UIBezierPath?对于150 * 150的正方形,花费这么多时间处理它是正常的(https://en.wikipedia.org/wiki/Bézier_curve)。您可以使用UIBezierPath来代替CoreGraphics而不是int side = 100; // number of squares in one side int delta = 300 / side; for (int i = 0; i < side; i++) { for (int j = 0; j < side; j++) { CGRect rectangle = CGRectMake(delta * i, delta * j, delta, delta); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.5); CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 0.5); CGContextFillRect(context, rectangle); CGContextStrokeRect(context, rectangle); } } 。这是Obj-C中的一个例子:

2016-01-09 23:55:02.677
2016-01-09 23:55:02.741

此示例绘制此正方形所需的时间不到0.1秒。

import cv2
import numpy as np
import imutils

lower = np.array([0, 48, 80], dtype= "uint8")
upper = np.array([20, 255, 255], dtype= "uint8")

img = cv2.imread('3.JPG', 0)
img = imutils.resize(img, width = 400)
cv2.waitKey(1)

converted = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
new_skinMask = cv2.inRange(converted, lower, upper)