如何清除UIView?

时间:2018-01-12 22:06:00

标签: ios swift uiview draw uigraphicscontext

我正在使用绘图应用,用户在视图上绘制内容。在同一个视图控制器上,我想创建一个按钮,它将擦除视图上的所有内容,并给它一个空白的平板。我该怎么做?我添加了附加到uiview的所有代码来绘制对象。

 import uikit 
class ViewController: UIViewController {
@IBOutlet weak var jj: draw!

@IBAction func enterScore(_ sender: Any) {
    (view as? drawViewSwift)?.clear()

}}

enter image description here

import  UIKit


 struct stroke {
let startPoint: CGPoint
let endPoint:  CGPoint
let color: CGColor

  }
class drawViewSwift: subClassOFUIVIEW {

var isDrawing = false
var lastPoint : CGPoint!
var strokeColor : CGColor = UIColor.black.cgColor
var storkes = [stroke]()
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard !isDrawing else {return}
    isDrawing = true
    guard let touch = touches.first else {return}
    let currentPoint = touch.location(in: self)

    lastPoint = currentPoint
    setNeedsDisplay()
}
 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard isDrawing else {return}
    guard let touch = touches.first else {return}
    setNeedsDisplay()

    let currentPoint = touch.location(in: self)
    print(currentPoint)
    let sstroke = stroke(startPoint: lastPoint, endPoint: currentPoint, color: strokeColor)
    storkes.append(sstroke)

    lastPoint = currentPoint

}
 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard isDrawing else {return}
    isDrawing = false
    guard let touch = touches.first else {return}
    let currentPoint = touch.location(in: self)
    let sstroke = stroke(startPoint: lastPoint, endPoint: currentPoint, color: strokeColor)
    storkes.append(sstroke)
    lastPoint = nil
    setNeedsDisplay()
    print(currentPoint)
}

private var clearing = false



func clear() {
    clearing = true
    setNeedsDisplay()
}

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

    defer { setNeedsDisplay() }
    let context = UIGraphicsGetCurrentContext()

    guard !clearing else {
        context?.clear(bounds)
        context?.setFillColor(backgroundColor?.cgColor ?? UIColor.clear.cgColor)
        context?.fill(bounds)
        storkes.removeAll()
        clearing = false
        return
    }
    context?.setLineWidth(10)
    context?.setLineCap(.round)
    for stroke in storkes {
        context?.beginPath()
        context?.move(to:stroke.startPoint)
        context?.addLine(to: stroke.endPoint)
        context?.setStrokeColor(stroke.color)
        context?.strokePath()
    }
}

func crase() {
    storkes = []
    strokeColor = UIColor.black.cgColor
    setNeedsDisplay()
}
  }
  class subClassOFUIVIEW: UIView {

override func awakeFromNib() {

    layer.shadowOpacity = 1
    layer.shadowOffset = CGSize(width: 1, height: 1)
    layer.shadowPath = CGPath(rect: bounds, transform: nil)
    layer.shadowPath = CGPath(rect: bounds, transform: nil)
}
  }

  class MyViewController : UIViewController {
override func loadView() {
    let view = drawViewSwift()
    view.backgroundColor = .white

    let button = UIButton()
    button.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
    button.setTitle("Clear", for: .normal)
    button.setTitleColor(.blue, for: .normal)
    button.addTarget(self, action: #selector(clear), for: .touchUpInside)
    view.addSubview(button)
    self.view = view
}

@objc func clear() {
    (view as? drawViewSwift)?.clear()
}
   }

3 个答案:

答案 0 :(得分:0)

您可以在此drawViewSwift课程中添加以下代码:

private var clearing = false
func clear() {
  clearing = true       
  setNeedsDisplay()
}

此时你的drawRect应该改变以清除视图:

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

  defer { setNeedsDisplay() }
  let context = UIGraphicsGetCurrentContext()

  guard !clearing else {
    context?.clear(bounds)
    context?.setFillColor(backgroundColor?.cgColor ?? UIColor.clear.cgColor)
    context?.fill(bounds)
    storkes.removeAll()
    clearing = false
    return
  }
  context?.setLineWidth(10)
  context?.setLineCap(.round)
  for stroke in storkes {
    context?.beginPath()
    context?.move(to:stroke.startPoint)
    context?.addLine(to: stroke.endPoint)
    context?.setStrokeColor(stroke.color)
    context?.strokePath()
  }
}

在守卫中,我们将调用上下文的clerk方法,该方法将上下文重置为其初始状态。此方法将导致上下文重绘透明视图。由于视图现在是透明的,我们必须重新绘制画布以再次使用背景颜色。我们在将填充颜色设置为视图的背景颜色后使用填充方法来完成。

此时剩下要做的就是清除我们的笔画数组并将清除值切换回false,这样我们就可以再画画了。

在视图控制器中,清除按钮只需调用此视图的清除方法。

在游乐场试试:

//: A UIKit based Playground for presenting user interface

import UIKit
import PlaygroundSupport

struct stroke {
  let startPoint: CGPoint
  let endPoint:  CGPoint
  let color: CGColor

}
class drawViewSwift: subClassOFUIVIEW {

  var isDrawing = false
  var lastPoint : CGPoint!
  var strokeColor : CGColor = UIColor.black.cgColor
  var storkes = [stroke]()
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard !isDrawing else {return}
    isDrawing = true
    guard let touch = touches.first else {return}
    let currentPoint = touch.location(in: self)

    lastPoint = currentPoint
    setNeedsDisplay()
  }
  override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard isDrawing else {return}
    guard let touch = touches.first else {return}
    setNeedsDisplay()

    let currentPoint = touch.location(in: self)
    print(currentPoint)
    let sstroke = stroke(startPoint: lastPoint, endPoint: currentPoint, color: strokeColor)
    storkes.append(sstroke)

    lastPoint = currentPoint

  }
  override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard isDrawing else {return}
    isDrawing = false
    guard let touch = touches.first else {return}
    let currentPoint = touch.location(in: self)
    let sstroke = stroke(startPoint: lastPoint, endPoint: currentPoint, color: strokeColor)
    storkes.append(sstroke)
    lastPoint = nil
    setNeedsDisplay()
    print(currentPoint)
  }

  private var clearing = false
  func clear() {
    clearing = true
    setNeedsDisplay()
  }

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

    defer { setNeedsDisplay() }
    let context = UIGraphicsGetCurrentContext()

    guard !clearing else {
      context?.clear(bounds)
      context?.setFillColor(backgroundColor?.cgColor ?? UIColor.clear.cgColor)
      context?.fill(bounds)
      storkes.removeAll()
      clearing = false
      return
    }
    context?.setLineWidth(10)
    context?.setLineCap(.round)
    for stroke in storkes {
      context?.beginPath()
      context?.move(to:stroke.startPoint)
      context?.addLine(to: stroke.endPoint)
      context?.setStrokeColor(stroke.color)
      context?.strokePath()
    }
  }

  func crase() {
    storkes = []
    strokeColor = UIColor.black.cgColor
    setNeedsDisplay()
  }
}
class subClassOFUIVIEW: UIView {

  override func awakeFromNib() {

    layer.shadowOpacity = 1
    layer.shadowOffset = CGSize(width: 1, height: 1)
    layer.shadowPath = CGPath(rect: bounds, transform: nil)
    layer.shadowPath = CGPath(rect: bounds, transform: nil)
  }
}

class MyViewController : UIViewController {
  override func loadView() {
    let view = drawViewSwift()
    view.backgroundColor = .white

    let button = UIButton()
    button.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
    button.setTitle("Clear", for: .normal)
    button.setTitleColor(.blue, for: .normal)
    button.addTarget(self, action: #selector(clear), for: .touchUpInside)
    view.addSubview(button)
    self.view = view
  }

  @objc func clear() {
    (view as? drawViewSwift)?.clear()
  }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

答案 1 :(得分:0)

您绘制和清除作品的代码。您应该更正viewController代码和您选择的布局结构。我认为制作一个专门用于绘制的视图会更好,例如,您可以在主视图中有3个不同的对象,一个用于标签,另一个用于按钮,最后一个用作drawViewSwift。使用这种结构,您的主视图可以处理对象之间的约束,而其他对象不会干扰绘图(并且显然是清洁......):

布局:

enter image description here

输出:

enter image description here

答案 2 :(得分:-1)

如果罢工次数很高 - 推荐

如果你的笔画数组太大了。我建议使用以下代码

let rectangle = CGRect(x: 0, y: 0, width: self.height, height: self.height)

CGContextSetFillColorWithColor(context, UIColor.white.CGColor)
CGContextAddRect(context, rectangle)
CGContextDrawPath(context, .Fill)

如果用户未画出多次罢工

由于您在阵列笔划中拥有所有当前绘制的笔划。下面的方法也会起作用。

使用您的视图背景颜色重新绘制上面的笔划

override func clearView() {
    let context = UIGraphicsGetCurrentContext()
    context?.setLineWidth(10)
    context?.setLineCap(.round)
    for stroke in storkes {
    context?.beginPath()
    context?.move(to:stroke.startPoint)
    context?.addLine(to: stroke.endPoint)
    context?.setStrokeColor(UIColor.white.cgColor)
          // Assuming your background color is white
    context?.strokePath()
    }   

}