#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. тх, круто узнать что-то новое =)