在 LongPressEnded 之后迅速从 SuperViews 中删除视图

Posted

技术标签:

【中文标题】在 LongPressEnded 之后迅速从 SuperViews 中删除视图【英文标题】:Swift Removing Views from SuperViews after LongPressEnded 【发布时间】:2018-02-25 13:44:18 【问题描述】:

我正在尝试在 longPress 结束后从 superView 中删除 imageView 和 backgroundView。我已经咨询了解决方案here 和here,它们应该可以工作。我想要实现的是,当我在我的collectionViewCell中长按imageView时,它会缩小图像,当我释放触摸时,imageView会缩小到单元格的位置,然后removeFromSuperview()

我当前的代码没有动画,也没有从 .ended 块的视图中删除 blackBackgroundView 和 zoomingImageView。两个视图都在视图中。

@objc func longPressOnImage(gestureRecognizer: UILongPressGestureRecognizer) 
        let gestureState = gestureRecognizer.state
        let cell = gestureRecognizer.view?.superview?.superview as! ChatBubbleCollectionViewCell
        let startingImageFrame = cell.messageImageView.convert(cell.messageImageView.frame, to: nil)
        let imageSize = cell.messageImageView.image?.size

        let zoomingImageView = UIImageView(frame: startingImageFrame)
        zoomingImageView.image = cell.messageImageView.image

        var blackBackgroundView = UIView()

        if gestureState == UIGestureRecognizerState.began 
            if let keyWindow = UIApplication.shared.keyWindow 
                blackBackgroundView = UIView(frame: keyWindow.frame)
                blackBackgroundView.backgroundColor = .black
                blackBackgroundView.alpha = 0

                keyWindow.addSubview(blackBackgroundView)
                keyWindow.addSubview(zoomingImageView)

                UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: 
                    let screenSize = UIScreen.main.bounds
                    let zoomHeight = screenSize.width / (imageSize?.width)! * (imageSize?.height)!
                    zoomingImageView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: zoomHeight)
                    zoomingImageView.center = self.view.center

                    blackBackgroundView.alpha = 1

                , completion: nil)
            

         else if gestureState == .ended 
            print("Ended")

            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: 
            blackBackgroundView.alpha = 0
            zoomingImageView.frame = startingImageFrame

            , completion:  (completed) in
            blackBackgroundView.removeFromSuperview()
            zoomingImageView.removeFromSuperview()
            )
        
    

请注意,当我松开手指触摸时,会打印打印语句。我想这表明执行代码的位置是正确的。但是,两个removeFromSuperview() 函数都没有被调用。以上代码是我的完整功能代码。

【问题讨论】:

【参考方案1】:

您在长按方法中创建了 zoomingImageView 和 blackBackgroundView ,而不是在该方法范围之外保留对它的引用。因此,当触摸结束事件发生时,该方法再次执行创建一个新的 zoomingImageView 和 blackBackgroundView,它永远不会添加,然后动画和删除。这就是为什么您看不到初始视图消失的原因。没有引用这些视图的变量,它们只是屏幕上无法访问的视图。

【讨论】:

以上是关于在 LongPressEnded 之后迅速从 SuperViews 中删除视图的主要内容,如果未能解决你的问题,请参考以下文章

在 gitlab 管道中运行“sudo su”

安装了cygwin之后无法获得root权限,更改了passwd也不行,输入su结果显示“-bash: su: 未找到命令"

安装zabbix之后登陆报错:Error connecting to database: No su

如何在 Ruby 中使用 net-ssh sudo su

从拿到一台云服务器开始(持续更新......)

用java实现从命令行接收多个数字,求和之后输出结果。