Развернуть UITableViewCell UIImage - PullRequest
0 голосов
/ 03 июля 2018

У меня есть UITableViewCell с двумя изображениями, моя цель - расширить эти изображения после длительного нажатия пользователем. В лучшем случае изображение будет покрывать весь экран маленьким крестиком или чем-то, что нужно закрыть.

У меня есть следующая функция, которую я использую в пользовательском UITableViewCell, но изображение только увеличивает размер ячейки. Я не могу понять, как расширить изображение по всей табличной панели / навигационной панели / вкладке суперпредставления.

@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, а не в камере, но я не смог заставить его работать таким образом.

1 Ответ

0 голосов
/ 03 июля 2018

Вы не должны добавлять свой вид к ячейке, но к контроллеру представления или к ключевому окну. Это зависит от ваших потребностей. что происходит в вашем случае, если изображение добавляется в ячейку и обрезается, а также неправильно позиционируется.

Я бы использовал какой-то объект, который обрабатывает представление этого изображения. Пусть код говорит сам за себя:

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?()
        }
    }

}

Как вы говорите, еще нужно добавить кнопку, которая затем может вызвать отклонение в представлении.

Примечание. Код, который я предоставил, на самом деле не был протестирован, а просто быстро собран. Дайте мне знать, если есть какие-либо проблемы, поэтому я изменю его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...