在 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 中删除视图的主要内容,如果未能解决你的问题,请参考以下文章
安装了cygwin之后无法获得root权限,更改了passwd也不行,输入su结果显示“-bash: su: 未找到命令"