You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:15:07