Ну, я не так хорош в Свифте, но до того, что я понимаю вашу проблему, это должно решить ее.
И если этого не произойдет, я уверен, что кто-то лучше в быстром ответит на это более лучшим способом.
Каждый ViewController
имеет базу view
, к которой вы можете получить доступ как view.method()
.
Вы добавляете подпредставление в существующее представление.
Предположим, вы хотите добавить новый UIView с именем view1.
Сначала вы его инициализируете, как,
view1 = UIView(frame: view.bounds)
Теперь, чтобы он появился на экране, сделайте как,
view.addSubview(view1)
Эта строка добавит view1
как подпредставление view
.
Также теперь view1
находится на вершине view
. Теперь, когда вы касаетесь экрана, вы получаете доступ к view1
.
Поэтому в следующий раз, когда вы проведете пальцем вправо, распознаватель жестов должен быть на view1
.
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(swipeRightAction))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
view1.addGestureRecognizer(swipeRight)
Вот как вы добавите жест смахивания вправо в view1.
Теперь, когда вы проведете вправо по экрану, будет вызван swipeRightAction()
.
Вы можете удалить это view1
из супер просмотра, как,
view1.removeFromSuperView()
Теперь view1 больше нет, и теперь вы можете добавить view2
аналогично тому, как мы добавили view1
.
См. Следующий код, он может быть связан.
//The old view that has to be replaced
var viewToBeRemoved : UIView!
//The new view that will replace the previous one
var viewToBeAdded : UIView!
override func viewDidLoad() {
super.viewDidLoad()
replaceWithNewSwipableSubview()
}
func replaceWithNewSwipableSubview()
{
viewToBeAdded = UIView(frame: view.bounds)
//New view being added should have a gesture so that next time
//it need to be replaced we can swipe on it
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(swipeRightAction))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
viewToBeAdded.addGestureRecognizer(swipeRight)
UIView.animate(withDuration: 1, animations: {
//This will be animated
if self.viewToBeRemoved != nil{
//As there is no subview the very first time this func is called
self.viewToBeRemoved.removeFromSuperview()
}
//Because next time it will be the view to be removed
self.viewToBeRemoved = self.viewToBeAdded
}) { (isFinished) in
//This block gets executed only after
//the block above has completed
self.view.addSubview(self.viewToBeAdded)
//view is the default base view of a ViewController
}
}
@objc func swipeRightAction() {
replaceWithNewSwipableSubview()
}
В вашем коде view1?.addSubview(CustomView(frame: self.view.bounds))
эта строка добавляет представление к view1, и у вас нет ссылки на добавляемое представление. Сначала вы должны сохранить добавленное представление как view3 = CustomView(frame: self.view.bounds)
, чтобы позже вы могли удалить представление3. Кроме того, ваш view1
фактически никогда не будет добавлен. Если я прав, потому что для добавления view1
сначала нужно добавить view.addSubview(view1)
.
Хотя, возможно, можно предложить лучшее решение, если вы сообщите нам, чего вы на самом деле хотите достичь?