Полноэкранное изображение пользовательской ячейки Swift Eureka

Я пытаюсь создать пользовательскую ячейку в Eureka, которая отображает изображение. При нажатии на изображение изображение отображается в полноэкранном режиме с черным фоном.

Обычно вы делаете это с помощью view.addSubview(newImageView), но не похоже, что у ячейки Eureka есть класс представления.

Вот что я получил до сих пор для ячейки:

final class ImageViewCell: Cell<ImageView>, CellType {

@IBOutlet weak var viewImage: UIImageView!

//let storage = Storage.storage().reference()

required init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override func setup() {
    super.setup()
    //cell not selectable
    selectionStyle = .none

    viewImage.contentMode = .scaleAspectFill
    viewImage.clipsToBounds = true

    height = {return 300 }

    //make userImage reconize tapping
    let tapRec = UITapGestureRecognizer(target: self, action: #selector(imageTapHandler(tapGestureRecognizer:)))
    viewImage.addGestureRecognizer(tapRec)
    viewImage.isUserInteractionEnabled = true

}

@objc func imageTapHandler(tapGestureRecognizer: UITapGestureRecognizer) {
    let imageView = tapGestureRecognizer.view as! UIImageView
    let newImageView = UIImageView(image: imageView.image)
    newImageView.frame = UIScreen.main.bounds
    newImageView.backgroundColor = .black
    newImageView.contentMode = .scaleAspectFit
    newImageView.isUserInteractionEnabled = true
    let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
    newImageView.addGestureRecognizer(tap)
    view.addSubview(newImageView)


}

@objc func dismissFullscreenImage(_ sender: UITapGestureRecognizer) {

    sender.view?.removeFromSuperview()
}

override func update() {
    super.update()

    // we do not want to show the default UITableViewCell's textLabel
    textLabel?.text = nil

    // get the value from our row
    guard let imageData = row.value else { return }

    // get user image data from value
    let downloadData = imageData.pictureData

    viewImage.image = UIImage(data: downloadData)


}



}

Я получаю «Использование неразрешенного идентификатора «представление»» при попытке addSubview.

Я попытался использовать contentView вместо просмотра, и результат такой:

Скриншот для представления


person solohan83    schedule 09.06.2018    source источник


Ответы (2)


Если вы хотите отобразить изображение в полноэкранном режиме, ячейка contentView или подвид viewController, содержащий эту ячейку, не являются правильными местами для добавления этого image как subview.

Правильным решением этой проблемы является использование обратного вызова onCellSelection (как показано ниже) в вашем контейнере ViewController и предоставление нового ViewController, который отображает единственное изображение в полноэкранном режиме или любые другие настройки, которые вы хотите.

imageCell.onCellSelection({[weak self] (cell, row) in
      let imageVC = DisplayViewController()
      imageVC.image = cell.viewImage.image
      self?.present(imageVC, animated: true, completion: nil)
})

Если вы хотите отображать полноэкранный режим только тогда, когда пользователь нажимает на изображение в ячейке, вы должны получить tapGesture callback в контейнере ViewController и показать изображение, как указано выше.

person Kamran    schedule 10.06.2018

Спасибо за Камрана, кажется, я нашел решение.

для строк Eureka вы всегда можете использовать обратный вызов row.onCellSelection.

в моем случае я могу сделать это при вызове пользовательской строки:

                            <<< ImageViewCellRow(){ row in
                            row.value = ImageView(pictureData: data!)
                            row.onCellSelection(showMe)
                    }

затем создайте функцию showMe следующим образом:

    func showMe(cell: ImageViewCell, row: (ImageViewCellRow)) {
            print("tapped my ImageViewCell!")
    }

теперь вы сможете представить полноэкранное изображение в виде кода Камрана.

person solohan83    schedule 20.06.2018