首页 > 解决方案 > UINavigationControllerPaletteClippingView 覆盖 UIImageView 并接收点击手势

问题描述

我正在点击图像视图以放大它,然后点击以关闭放大的图像。关闭水龙头不起作用。当我查看视图层次结构时,我发现在我认为正在接收点击的图像视图上有一个 UINavigationControllerPaletteClippingView。他们在 iOS 11 中提到了一个类似的问题我几乎找不到任何关于此的文档,我有点迷路了。这是我的代码:

@objc func enlargeImage(sender: UITapGestureRecognizer) {

    let image = (sender.view as! UIImageView).image
    let enlargedImageView = UIImageView(image: image)
    enlargedImageView.frame = view.frame
    enlargedImageView.backgroundColor = .black
    enlargedImageView.contentMode = .scaleAspectFit
    enlargedImageView.isUserInteractionEnabled = true
    let tapToDismiss = UIGestureRecognizer(target: self, action: #selector(dismissEnlargedImage))
    enlargedImageView.addGestureRecognizer(tapToDismiss)
    self.view.addSubview(enlargedImageView)
    self.navigationController?.isNavigationBarHidden = true
}

@objc func dismissEnlargedImage(sender: UITapGestureRecognizer) {
    self.navigationController?.isNavigationBarHidden = false
    sender.view?.removeFromSuperview()
}

任何帮助表示赞赏!

更新:

在此处输入图像描述

这是视图调试器屏幕截图。

我在dismissEnlargedImage 中放置了一个断点,但它从未到达过,所以我认为没有这样的问题。而且我在单独的函数中声明了两个手势识别器,所以我看不到范围成为问题的方法。

标签: iosuinavigationcontrollerswift4ios11

解决方案


_UINavigationControllerPaletteClippingView在 iOS 11 中引入,简而言之,处理通过其searchController属性添加到导航项的导航栏中搜索栏的外观。它与 iOS 11 中引入的大标题和折叠栏结合使用。

你会发现关于这个类的文档很少,因为它是 UIKit 私有的(即,如果你想保持 AppStore 的一致性,你不应该直接使用它)。

话虽如此,如果没有更多上下文,可能很难分析您的问题。您能否提供一个布局调试器的屏幕截图,您可以在其中看到_UINavigationControllerPaletteClippingView您正在添加的图像视图的覆盖范围?

是否在可搜索屏幕中添加了图像视图。即当您显示图像时,导航场景是否包含搜索栏?

如果其他上下文为我(我们)提供了在哪里寻找问题的线索,我会很高兴地更新这个答案。


更新

enlargeImage似乎是由 a 调用的UITapGestureRecognizer。您能否确认这两种方法的调用方式和顺序等不涉及任何猴子业务?

我的意思是:

  • Maybe与您enlargeImage同时显示和隐藏图像的每个点击同时调用dismissEnlargedImage,给您的印象是关闭点击不起作用?
  • 也许手势识别器调用enlargeImage与手势识别器调用相关,dismissEnlargedImage使得其中一个阻止另一个触发?

推荐阅读