как защитить UIView после нажатия с помощью UITapGestureRecognizer

#ios #swift #uikit #uigesturerecognizer #uitapgesturerecognizer

Вопрос:

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

 import UIKit  class ViewController: UIViewController {    // MARK: - Property    let circle: UIView = {  let circle = UIView()  circle.frame.size.height = 100  circle.frame.size.width = 100  circle.layer.borderWidth = 10  circle.layer.borderColor = UIColor.white.cgColor  circle.layer.cornerRadius = 50  return circle  }()    // MARK: - LifeCycle   override func viewDidLoad() {  super.viewDidLoad()    addRecognizer()  view.backgroundColor = .red  }    // MARK: - Methods    @IBAction func tappedRecognizer(_ recognizer: UITapGestureRecognizer) {    let tapLocation = recognizer.location(in: view)  let circleHeight = circle.frame.size.height  let circleWidth = circle.frame.size.width  print(tapLocation)  circle.frame.origin = .init(x: tapLocation.x - circleWidth/2, y: tapLocation.y - circleHeight/2)  view.addSubview(circle)  }    func addRecognizer() {    let recognizer = UITapGestureRecognizer(target: self, action: #selector(tappedRecognizer(_:)))  self.view.addGestureRecognizer(recognizer)  }   }  

Комментарии:

1. Что означают «обезопасить UIView» и «обезопасить его на экране»?

2. Это означает, что если я нажму на экран 5 раз, у меня будет 5 uiview (круги в моем примере), где я нажал

3. Чтобы сохранять UIView каждый раз, вам нужно каждый раз создавать новый . Здесь вы всегда используете один и тот же (круг), созданный при инициализации UIViewController. Затем у вас может быть массив всех созданных вами представлений.

4. @PtitXav могу ли я попросить вас показать пример, какой массив я должен создать из примеров моих кругов ?

Ответ №1:

Добавьте массив в свой класс и метод, чтобы создать новый круг :

 class ViewController: UIViewController {   // MARK: - Property  var circles = [UIView]()   func newCircle(atLocation tapLocation: CGPoint) -gt; UIView {  let circle = UIView()  circle.frame.size.height = 100  circle.frame.size.width = 100  circle.layer.borderWidth = 10  circle.layer.borderColor = UIColor.white.cgColor  circle.layer.cornerRadius = 50  circle.frame.origin = .init(x: tapLocation.x - circle.frame.size.width/2,   y: tapLocation.y - circle.frame.size.height/2)  circles.append(circle)  return circle  }   @IBAction func tappedRecognizer(_ recognizer: UITapGestureRecognizer) {  let tapLocation = recognizer.location(in: view)  print(tapLocation)  let circle = newCircle(atLocation: tapLocation)  view.addSubview(circle)  }  }  

Другой способ-использовать вычисляемое свойство (возможно, это то, чего вы пытались достичь). Для этого просто удалите = из определения свойства :

 let circle: UIView { /: no =  get {  let circle = UIView()  circle.frame.size.height = 100  circle.frame.size.width = 100  circle.layer.borderWidth = 10  circle.layer.borderColor = UIColor.white.cgColor  circle.layer.cornerRadius = 50  return circle  }  } // no ()  

Комментарии:

1. тх, круто узнать что-то новое =)