Получение снимка для некоторых ячеек не работает

Я хочу получить снимок для ячейки после долгого нажатия, и я получаю это работает. Я создаю снимки с помощью этого кода:

func customSnapShotFrom(view:UIView) -> UIView { // calling this with UITableViewCell input
    let snapshot:UIView = view.snapshotViewAfterScreenUpdates(false) // here I tried true and false
    snapshot.layer.masksToBounds = false
    snapshot.layer.cornerRadius = 0.0
    snapshot.layer.shadowOffset = CGSizeMake(2.0, 2.0)
    snapshot.layer.shadowOpacity = 1.0
    return snapshot
}

Это работает, но иногда я получаю это сообщение в выводе:

Снимок представления, который не был обработан, приводит к пустому снимку. Убедитесь, что ваш вид был обработан хотя бы один раз перед снимком или снимком экрана после обновления экрана.

Я получаю это только для некоторых клеток (только несколько) и не всегда. Иногда он генерирует снимок из этой ячейки, в противном случае он возвращает ноль. Я проверил, и у меня всегда есть ячейка на входе. Так почему это так? Почему рендеринг приводит к пустому снимку? Спасибо

Изменить: я добавил распознаватель жестов в мой tableView:

let longPress = UILongPressGestureRecognizer(target: self, action: "longPressDetected:")
self.tableView.addGestureRecognizer(longPress)

И я создаю снимок в longPressDetected метод:

func longPressDetected(sender: AnyObject) {
    ...
    switch (state) {
    case UIGestureRecognizerState.Began :

            ...
            let cell:UITableViewCell = self.tableView.cellForRowAtIndexPath(indexPath)!
            snapshot = self.customSnapShotFrom(cell)
    ...

Мое быстрое решение благодаря ответу Кирандера:

func customSnapShotFrom(view:UIView) -> UIView {

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0)
    view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let cellImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    let imageView = UIImageView(image: cellImage)
    imageView.layer.masksToBounds = false
    imageView.layer.cornerRadius = 0.0
    imageView.layer.shadowOffset = CGSizeMake(2.0, 2.0)
    imageView.layer.shadowRadius = 4.0
    imageView.layer.shadowOpacity = 1.0
    return imageView
}

1 ответ

Решение

Попробуйте этот код отсюда

// make an image from the pressed tableview cell
UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, NO, 0);
[inputView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *cellImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// create and image view that we will drag around the screen
UIView *snapshot = [[UIImageView alloc] initWithImage:cellImage];
Другие вопросы по тегам