【发布时间】:2019-05-26 05:43:28
【问题描述】:
我想在每次向右滑动时添加一个新的子视图,但是如果我不破坏之前的子视图,它将堆叠很多次。我知道如何删除它,但我正在努力解决如何在我添加一个新的之后才删除它的逻辑。
我试过这个:
var view1: UIView?
var view2: UIView?
var ctrl = false
override func viewDidLoad() {
super.viewDidLoad()
view1?.addSubview(CustomView(frame: self.view.bounds))
}
func addView(){
if let test1 = view1, let test2 = view2 {
if ctrl == true {
test1.addSubview(CustomView(frame: self.view.bounds))
test2.removeFromSuperview()
ctrl = false
}else{
test2.addSubview(CustomView(frame: self.view.bounds))
test1.removeFromSuperview()
ctrl = true
}
}
}
@IBAction func swipeRight(_ sender: Any) {
print("Right")
UIView.animate(withDuration: 1, animations: {
self.view.layer.backgroundColor = .black
}){(isFinished) in
self.addView()
//I am hoping that after this the view stack before will be removed
}
}
CustomView 类是这样的:
var primaryColors: [UIColor] = [
.red,
.yellow,
.blue]
class CustomView: UIView {
override func draw(_ rect: CGRect) {
super.draw(rect)
primaryColors.shuffle()
let leftRect = CGRect(x: 0, y: 0, width: rect.size.width/2, height: rect.size.height)
primaryColors[0].set()
guard let leftContext = UIGraphicsGetCurrentContext() else { return }
leftContext.fill(leftRect)
let rightRect = CGRect(x: rect.size.width/2, y: 0, width: rect.size.width/2, height: rect.size.height)
primaryColors[1].set()
guard let rightContext = UIGraphicsGetCurrentContext() else { return }
rightContext.fill(rightRect)
}
}
【问题讨论】:
-
我猜你应该在第二个完成处理程序中添加视图,但在第一个完成处理程序中删除以前的视图。试一试。
-
第二个完成处理程序和第一个完成处理程序是什么意思? @米希尔
-
在
UIView.animate()中,您使用了 2 个闭包,或者只是第一个块和第二个块。还请阅读this 文章。它关于完成处理程序。 -
@Mihir 我明白你的建议,但我不知道为什么它不会添加然后删除,它只是不断删除视图,我希望它会先添加一个视图然后删除以前的,但由于视图没有改变,我认为它只是继续删除而不是先添加它。
-
在您的代码
view1?.addSubview(CustomView(frame: self.view.bounds))中,这一行将视图添加到 view1 并且您没有引用要添加的视图。您应该首先存储您添加的视图,例如view3 = CustomView(frame: self.view.bounds),以便稍后您可以删除 view3。此外,您的view1实际上永远不会被添加如果我是对的,因为要添加view1,您需要先添加view.addSubview(view1)。