Ios UIView如何绘制摄影机选择器

Ios UIView如何绘制摄影机选择器,ios,uiview,draw,Ios,Uiview,Draw,我正在寻找在视图周围绘制这样的框架的方法。 可以使用iOS本机绘图吗? 绘制本机渲染很容易做到这一点。其中一种方法是创建一个新视图并重写drawrect方法。您可以执行以下操作: class ViewWithFrame: UIView { var color: UIColor = UIColor.black { didSet { setNeedsDisplay() } } var lineThickness: CGFloat = 5 { didSet { setNeedsDis

我正在寻找在视图周围绘制这样的框架的方法。 可以使用iOS本机绘图吗?

绘制本机渲染很容易做到这一点。其中一种方法是创建一个新视图并重写
drawrect
方法。您可以执行以下操作:

class ViewWithFrame: UIView {

    var color: UIColor = UIColor.black { didSet { setNeedsDisplay() } }
    var lineThickness: CGFloat = 5 { didSet { setNeedsDisplay() } }
    var lineLength: CGFloat = 30.0 { didSet { setNeedsDisplay() } }

    override var frame: CGRect { didSet { setNeedsDisplay() } }
    override func layoutSubviews() {
        super.layoutSubviews()
        setNeedsDisplay()
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        var paths: [UIBezierPath] = [UIBezierPath]()

        // Top left
        paths.append({
            let path = UIBezierPath()
            path.move(to: .zero)
            path.addLine(to: CGPoint(x: lineLength, y: 0.0))
            path.addQuadCurve(to: CGPoint(x: lineLength-lineThickness, y: lineThickness), controlPoint: CGPoint(x: lineLength, y: lineThickness))
            path.addLine(to: CGPoint(x: lineThickness, y: lineThickness))
            path.addLine(to: CGPoint(x: lineThickness, y: lineLength-lineThickness))
            path.addQuadCurve(to: CGPoint(x: 0.0, y: lineLength), controlPoint: CGPoint(x: lineThickness, y: lineLength))
            path.close()
            return path
            }())

        // Top right
        paths.append({
            let path = UIBezierPath()
            path.move(to: CGPoint(x: frame.width, y: 0.0))
            path.addLine(to: CGPoint(x: frame.width-lineLength, y: 0.0))
            path.addQuadCurve(to: CGPoint(x: frame.width-(lineLength-lineThickness), y: lineThickness), controlPoint: CGPoint(x: frame.width-lineLength, y: lineThickness))
            path.addLine(to: CGPoint(x: frame.width-lineThickness, y: lineThickness))
            path.addLine(to: CGPoint(x: frame.width-lineThickness, y: lineLength-lineThickness))
            path.addQuadCurve(to: CGPoint(x: frame.width, y: lineLength), controlPoint: CGPoint(x: frame.width-lineThickness, y: lineLength))
            path.close()
            return path
            }())

        // TODO: add 2 bottom paths

        color.setFill()
        paths.forEach { $0.fill() }
    }

}
底部部分仍然需要绘制,但我希望您了解如何绘制


记下对
setNeedsDisplay
的所有调用。这将在下一次运行循环中触发
draw rect
方法,并且对于可能影响绘图(包括视图大小)的视图的每次更改都应触发该方法。

绘图这在本机渲染中很容易实现。其中一种方法是创建一个新视图并重写
drawrect
方法。您可以执行以下操作:

class ViewWithFrame: UIView {

    var color: UIColor = UIColor.black { didSet { setNeedsDisplay() } }
    var lineThickness: CGFloat = 5 { didSet { setNeedsDisplay() } }
    var lineLength: CGFloat = 30.0 { didSet { setNeedsDisplay() } }

    override var frame: CGRect { didSet { setNeedsDisplay() } }
    override func layoutSubviews() {
        super.layoutSubviews()
        setNeedsDisplay()
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        var paths: [UIBezierPath] = [UIBezierPath]()

        // Top left
        paths.append({
            let path = UIBezierPath()
            path.move(to: .zero)
            path.addLine(to: CGPoint(x: lineLength, y: 0.0))
            path.addQuadCurve(to: CGPoint(x: lineLength-lineThickness, y: lineThickness), controlPoint: CGPoint(x: lineLength, y: lineThickness))
            path.addLine(to: CGPoint(x: lineThickness, y: lineThickness))
            path.addLine(to: CGPoint(x: lineThickness, y: lineLength-lineThickness))
            path.addQuadCurve(to: CGPoint(x: 0.0, y: lineLength), controlPoint: CGPoint(x: lineThickness, y: lineLength))
            path.close()
            return path
            }())

        // Top right
        paths.append({
            let path = UIBezierPath()
            path.move(to: CGPoint(x: frame.width, y: 0.0))
            path.addLine(to: CGPoint(x: frame.width-lineLength, y: 0.0))
            path.addQuadCurve(to: CGPoint(x: frame.width-(lineLength-lineThickness), y: lineThickness), controlPoint: CGPoint(x: frame.width-lineLength, y: lineThickness))
            path.addLine(to: CGPoint(x: frame.width-lineThickness, y: lineThickness))
            path.addLine(to: CGPoint(x: frame.width-lineThickness, y: lineLength-lineThickness))
            path.addQuadCurve(to: CGPoint(x: frame.width, y: lineLength), controlPoint: CGPoint(x: frame.width-lineThickness, y: lineLength))
            path.close()
            return path
            }())

        // TODO: add 2 bottom paths

        color.setFill()
        paths.forEach { $0.fill() }
    }

}
底部部分仍然需要绘制,但我希望您了解如何绘制


记下对
setNeedsDisplay
的所有调用。这将在下一次运行循环中触发
draw rect
方法,并且对于可能影响绘图(包括视图大小)的视图的每一次更改都应该触发该方法。

您可以使用带有此类边框和透明区域的.png。或者使用bezier路径在视图上绘制此类路径。您可以使用带有此类边框和透明区域的.png。或者使用bezier路径在视图上绘制此类路径