Как удалить предыдущий стек UIView после добавления нового? - PullRequest
0 голосов
/ 26 мая 2019

Я хочу добавлять новое подпредставление каждый раз, когда проводу вправо, но тогда оно будет складываться много раз, если я не уничтожу предыдущее подпредставление.Я знаю, как удалить его, но я борюсь с логикой того, как удалить его, только после добавления нового.

Я пробовал это:

    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)
    }
}

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Ну, я не так хорош в Свифте, но до того, что я понимаю вашу проблему, это должно решить ее. И если этого не произойдет, я уверен, что кто-то лучше в быстром ответит на это более лучшим способом.

Каждый 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).

Хотя, возможно, можно предложить лучшее решение, если вы сообщите нам, чего вы на самом деле хотите достичь?

0 голосов
/ 26 мая 2019

Может не работать. В вашем условии if метода addSubview вы используете: if let test1 = view1, let test2 = view2, который проверяет, что view1 и view2 не nil. Это должно произойти сбой, потому что вы только инициализировали view1 в viewDidLoad(): view1?.addSubview(CustomView(frame: self.view.bounds)). Таким образом, выше, если условие view2 должно быть равно нулю и, следовательно, оно оценивается как false.

Попробуйте поставить условие if следующим образом: if let test1 = view1 || let test2 = view2 (проверьте синтаксис, если он дает ошибку, ll выдаст ошибку, если условие с let). И дай мне знать, если это не сработает. Попробуйте следующий код:

if((self.view1 != nil) || (self.view2 != nil){
    if ctrl == true {
        self.view1?.addSubview(CustomView(frame: self.view.bounds))
        self.view2?.removeFromSuperview()
        ctrl = false
    }else{
        self.view2?.addSubview(CustomView(frame: self.view.bounds))
        self.view1?.removeFromSuperview()
        ctrl = true
    }   
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...