2017-10-09 4 views
-1

Je construis une application iOS où j'ai une classe nommée "DrawableCanvas" qui s'étend UIView. L'idée est de permettre aux utilisateurs de dessiner sur UIViews dans le Storyboard qui étendent la classe que j'ai faite.iOS Swift 3 - Effacer l'UIView

Le dessin fonctionne bien et est lisse à ce stade. Voici le code je:

class DrawableView: UIView { 

    let path=UIBezierPath() 
    var previousPoint:CGPoint 
    var lineWidth:CGFloat=1.0 

    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override init(frame: CGRect) { 
     previousPoint=CGPoint.zero 
     super.init(frame: frame) 

    } 

    required init?(coder aDecoder: NSCoder) { 
     previousPoint=CGPoint.zero 
     super.init(coder: aDecoder) 

     let panGestureRecognizer=UIPanGestureRecognizer(target: self, action: #selector(pan)) 
     panGestureRecognizer.maximumNumberOfTouches=1 

     self.addGestureRecognizer(panGestureRecognizer) 

    } 

    override func draw(_ rect: CGRect) { 
     // Drawing code 
     UIColor.black.setStroke() 
     path.stroke() 
     path.lineWidth=lineWidth 
    } 

    func pan(panGestureRecognizer:UIPanGestureRecognizer)->Void{ 
     let currentPoint=panGestureRecognizer.location(in: self) 
     let midPoint=self.midPoint(p0: previousPoint, p1: currentPoint) 


     if panGestureRecognizer.state == .began{ 
      path.move(to: currentPoint) 
     } 
     else if panGestureRecognizer.state == .changed{ 
      path.addQuadCurve(to: midPoint,controlPoint: previousPoint) 
     } 

     previousPoint=currentPoint 
     self.setNeedsDisplay() 
    } 

    func midPoint(p0:CGPoint, p1:CGPoint)->CGPoint{ 
     let x=(p0.x+p1.x)/2 
     let y=(p0.y+p1.y)/2 
     return CGPoint(x: x, y: y) 
    } 
} 

Bien sûr, je dois dégager la vue sur une presse de bouton, et voici mon bouton action presse:

@IBAction func reset1(_ sender: AnyObject) { 
    print("reset hit!") 
    sig1View.setNeedsLayout() 
    sig1View.setNeedsDisplay() 
} 

sig1View est l'opinion que je suis en train réinitialiser.

Cela n'a pas fonctionné, alors que j'ai essayé au lieu d'écrire un était reloadData() dans la classe DrawableView:

func reloadData() { 
    print("reload data hit") 
    self.setNeedsDisplay() 

} 

La fonction été appelé, mais aussi, ne fonctionne pas. Comment effacer ou réinitialiser un UIView dans iOS Swift 3? Et le plomb et l'aide sont très appréciés.

+0

Pourriez-vous faire un appel à 'pour la couche dans view.layers.sublayers {layer.removeFromSuperlayer()}' Je n'ai pas beaucoup d'expérience avec des chemins de dessin, mais c'est ce que je j'essaierais d'abord –

Répondre

1

Appelez la fonction DrawableView (instance) path.removeAllPoints pour supprimer tous les dessins/chemin.

donc suivant votre code, reset1 devrait ressembler à ceci maintenant:

@IBAction func reset1(_ sender: AnyObject) { 
    print("reset hit!") 
    sig1View.path.removeAllPoints() 
    sig1View.setNeedsDisplay() 
} 
0

Le problème est que, bien que votre question parle de « remise à zéro », votre Code ne pas en fait quoi que ce soit remis à zéro. Vous dites:

override func draw(_ rect: CGRect) { 
    // Drawing code 
    UIColor.black.setStroke() 
    path.stroke() 
    path.lineWidth=lineWidth 
} 

Alors c'est ce qui se passe. Tant que path contient un chemin dessiné, c'est ce qui est dessiné dans votre vue chaque fois que la vue se redessine elle-même. Si ce n'est pas ce que vous voulez, modifiez le path ou modifiez l'implémentation de draw.

0

Ajouter cette méthode pour DrawableView classe et l'appeler par exemple sig1View:

func clear() 
{ 
    path.removeAllPoints() 
    setNeedsDisplay() 
} 

et l'appeler à partir de la méthode de réinitialisation .

Utilisation:

sig1View.clear()