使用UITapGestureRecognizer点击后如何让添加的UIView保留在屏幕上
问题修复说明
根因
你将circle声明为了ViewController的全局单实例属性,整个控制器生命周期内该视图只会被创建1次。每次调用addSubview添加同一个视图实例时,系统会先将该实例从之前的父视图层级中移除,再添加到当前指定的父视图的最新位置,因此你始终只能看到最后一次点击生成的视图,之前添加的会被自动移除,视觉上就是「松开手就消失」的效果。
修复代码
你只需要把全局的circle属性删除,改为每次点击回调内创建新的circle实例即可,调整后代码如下:
import UIKit class ViewController: UIViewController { // MARK: - LifeCycle override func viewDidLoad() { super.viewDidLoad() addRecognizer() view.backgroundColor = .red } // MARK: - Methods @objc private func tappedRecognizer(_ recognizer: UITapGestureRecognizer) { // 每次点击生成新的圆形视图实例 let circle = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) circle.layer.borderWidth = 10 circle.layer.borderColor = UIColor.white.cgColor circle.layer.cornerRadius = 50 // 直接设置center为点击位置,无需手动计算原点偏移 circle.center = recognizer.location(in: view) view.addSubview(circle) } private func addRecognizer() { let recognizer = UITapGestureRecognizer(target: self, action: #selector(tappedRecognizer(_:))) view.addGestureRecognizer(recognizer) } }
内容的提问来源于stack exchange,提问作者Artem Mazur
相关产品推荐
相关产品推荐

