【问题标题】:Expand UITableViewCell UIImage展开 UITableViewCell UIImage
【发布时间】:2018-12-11 08:43:30
【问题描述】:

我有一个带有两张图片的UITableViewCell,我的目标是在用户长按时扩展这些图片。在最好的情况下,图像将覆盖整个屏幕,并带有一个小“x”或关闭的东西。

我在自定义UITableViewCell 中使用了以下函数,但图像只会扩大单元格的大小。我不知道如何在超级视图的整个 tableview/navBar/tabbar 上展开图像。

@objc func answerOneLongPress(_ sender: UILongPressGestureRecognizer) {
    let imageView = sender.view as! UIImageView
    let newImageView = UIImageView(image: imageView.image)
    let screenSize = UIScreen.main.bounds
    let screenWidth = screenSize.width
    let screenHeight = screenSize.height
    newImageView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight)
    newImageView.backgroundColor = .black
    newImageView.contentMode = .scaleAspectFit
    self.addSubview(newImageView)
}

如果您需要更多信息,请告诉我。我觉得这应该发生在UITableViewController 而不是单元格中,但无法让它以这种方式工作。

【问题讨论】:

  • 您可以在长按上使用可折叠的表格视图,只需重新加载特定部分
  • 你能添加一个 gif 来显示发生了什么问题吗?
  • @RahulGUsai 是否愿意提供一些示例或更多信息?
  • self 在您添加子视图的上下文中是什么?您需要将此子视图添加到视图控制器的视图或将事件添加到窗口UIApplication.shared.keyWindow。如果这是一个单元格,那么您的图像视图将被剪裁,甚至定位不正确。

标签: ios swift uitableview uiimageview


【解决方案1】:

您不应该将视图添加到单元格,而是添加到视图控制器或关键窗口。这取决于您的需求。在您的情况下发生的情况是您的图像视图被添加到单元格上并被剪裁,而且它的位置也不正确。

我会使用某种对象来处理此图像的呈现。让代码自己说话:

class ImageOverlayController {

    private var startFrame: CGRect
    private var backgroundView: UIView
    private var imageView: UIImageView

    private init(startFrame: CGRect, backgroundView: UIView, imageView: UIImageView) {
        self.startFrame = startFrame
        self.backgroundView = backgroundView
        self.imageView = imageView
    }

    private convenience init() { self.init(startFrame: .zero, backgroundView: UIView(), imageView: UIImageView())  }

    static func showPopupImage(inController viewController: UIViewController? = nil, fromImageView imageView: UIImageView) -> ImageOverlayController {
        guard let targetView = viewController?.view ?? UIApplication.shared.keyWindow else { return ImageOverlayController() } // This should never happen

        let startFrame = imageView.convert(imageView.bounds, to: targetView)

        let backgroundView: UIView = {
            let view = UIView(frame: targetView.bounds)
            view.backgroundColor = UIColor.black.withAlphaComponent(0.0)
            return view
        }()

        let newImageView: UIImageView = {
            let view = UIImageView(frame: startFrame)
            view.image = imageView.image
            return view
        }()

        let controller = ImageOverlayController(startFrame: startFrame, backgroundView: backgroundView, imageView: imageView)

        backgroundView.addSubview(newImageView)
        targetView.addSubview(backgroundView)

        UIView.animate(withDuration: 0.3) {
            backgroundView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
            newImageView.frame = targetView.bounds
        }

        return controller

    }

    func dimiss(completion: (() -> Void)? = nil) {
        UIView.animate(withDuration: 0.3, animations: {
            self.imageView.frame = self.startFrame
            self.backgroundView.backgroundColor = self.backgroundView.backgroundColor?.withAlphaComponent(0.0)
        }) { _ in
            self.backgroundView.removeFromSuperview()
            completion?()
        }
    }

}

正如您所说,仍然必须添加一个按钮,然后可能会在视图上调用关闭。

注意:我提供的代码没有经过真正的测试,只是快速组合在一起。如果有任何问题,请告诉我,以便我修改它。

【讨论】:

  • 非常感谢您。我会给它一个测试。很抱歉这个菜鸟问题,但您能否提供一些关于如何从 UITableViewController 使用此类的指导?
  • @CaseyWest 你是什么意思?这是一种静态方法,可以与任何东西一起使用。您可以在单元格或任何地方简单地调用它ImageOverlayController. showPopupImage(fromImageView: myImageView) 那么UITableViewController 有什么区别?
  • 显示图像效果很好。我发现的唯一问题是,如果您按住(按住)它会无限尝试显示图像,这可能是由我的单元格中的某些东西引起的。展开动画会一直发生,直到您释放按钮。目前正在添加退出按钮。谢谢!!
  • @CaseyWest 长按手势与平移手势相同,但需要按住才能触发。您缺少的是检查手势识别器状态。在您的情况下,它需要是 .begin 才能触发图像显示。在您的情况下发生的情况是,如果您继续移动手指,该方法将继续触发状态.change,当您放手时,它也会触发.ended。所以你只需要一个if 声明。
  • 好的,我添加了一个 if 语句,它不再是垃圾邮件了。我在解雇方面遇到了麻烦。您是否可以在使用您的课程的原始问题中包含我的函数的附加版本?这将非常有帮助,很抱歉我对此很陌生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
相关资源
最近更新 更多