使用按钮添加和删除子视图

时间:2017-03-03 22:48:52

标签: ios swift swift3

嘿伙计们,所以我画了一个圆圈并使用按钮将其添加为子视图。当我尝试使用removefromsuperview将其删除时,它并没有消失。请检查以下代码。

我添加了一个名为Removecircle的按钮,因此我可以添加或删除圆圈,但这不会按计划进行。

import UIKit
   import GLKit
   class ViewController: UIViewController {
    var numb = 0
    override func viewDidLoad() {
    super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

   @IBAction func Removecircle(_ sender: Any) {
    let radius = Int( view.frame.maxX )
    let HvalueX = 0
    let HvalueY = Int( view.frame.maxY )/2 - Int( view.frame.maxX )/2
    // Create a new CircleView
    let circleView = CircleView( frame:CGRect(x: HvalueX, y: HvalueY, width: radius, height: radius ))
    //let test = CircleView(frame: CGRect(x: diceRoll, y: 0, width: circleWidth, height: circleHeight))
    if numb%2 == 0 {
        view.addSubview(circleView)

        // Animate the drawing of the circle over the course of 1 second
        circleView.animateCircle(duration: 4.0)
        circleView.circleLayer.strokeColor = UIColor.blue.cgColor

    }else if numb%2 == 1 {

        circleView.removeFromSuperview()
    }
    numb = numb + 1
}
@IBOutlet weak var removecircle: UIButton!

 }

class CircleView: UIView {
 var circleLayer: CAShapeLayer!

override init(frame: CGRect) {
    super.init(frame: frame)
    self.backgroundColor = UIColor.clear

    // Use UIBezierPath as an easy way to create the CGPath for the layer.
    // The path should be the entire circle.
    let circlePath = UIBezierPath(arcCenter: CGPoint(x: frame.size.width / 2.0, y: frame.size.height / 2.0), radius: (frame.size.width - 10)/2, startAngle: 0.0, endAngle: CGFloat(M_PI * 2.0), clockwise: true)

    // Setup the CAShapeLayer with the path, colors, and line width
    circleLayer = CAShapeLayer()
    circleLayer.path = circlePath.cgPath
    circleLayer.fillColor = UIColor.clear.cgColor
    circleLayer.strokeColor = UIColor.white.cgColor
    circleLayer.lineWidth = 3.0;

    // Don't draw the circle initially
    circleLayer.strokeEnd = 0.0

    // Add the circleLayer to the view's layer's sublayers
    layer.addSublayer(circleLayer)
    animateCircle(duration: 2)

}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func animateCircle(duration: TimeInterval) {
    // We want to animate the strokeEnd property of the circleLayer
    let animation = CABasicAnimation(keyPath: "strokeEnd")

    // Set the animation duration appropriately
    animation.duration = duration

    // Animate from 0 (no circle) to 1 (full circle)
    animation.fromValue = 0
    animation.toValue = 1

    // Do a linear animation (i.e. the speed of the animation stays the same)
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)

    // Set the circleLayer's strokeEnd property to 1.0 now so that it's the
    // right value when the animation ends.
    circleLayer.strokeEnd = 1.0

    // Do the actual animation
    circleLayer.add(animation, forKey: "animateCircle")
}


}

1 个答案:

答案 0 :(得分:1)

每次按下按钮,您都会创建一个新的CircleView。相反,第一次创建它并将其存储为ViewController的属性。然后,当您按下按钮时,您应该可以使用removeFromSuperview()删除它。