Подтвердить что ты не робот

Пустой снимок экрана на iPhone 7/7plus

Мой первый вопрос здесь:) Недавно я обновляю свой Xcode до 8, а метод resizableSnapshotView работает некорректно на некоторых симуляторах. SnapshotView хорошо работает на всех тестовых устройствах с iOS9/10 и симуляторами под iPhone6, но на iPhone7/7p симуляторах он пуст. Я думаю, что 7/7p могут потребоваться некоторые полномочия для доступа к снимку, но я понятия не имею, что это такое.

let cell = self.tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! CalendarCell     
var topFrame = cell.frame
topFrame.origin.y = tableView.contentOffset.y
topFrame.size.height -= tableView.contentOffset.y
topSnapshotView = tableView.resizableSnapshotView(from: topFrame, afterScreenUpdates: false, withCapInsets: UIEdgeInsets.zero)
4b9b3361

Ответ 1

Используйте следующее расширение UIView для создания моментального снимка с использованием CoreGraphics.

Я могу подтвердить, что это работает на симуляторе iPhone 7.

public extension UIView {

    public func snapshotImage() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
        drawHierarchy(in: bounds, afterScreenUpdates: false)
        let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return snapshotImage
    }

    public func snapshotView() -> UIView? {
        if let snapshotImage = snapshotImage() {
            return UIImageView(image: snapshotImage)
        } else {
            return nil
        }
    }
}

Ответ 2

Работает в:

  • Версия 8.1 (8B62)
  • Simulator Version 10.0 (SimulatorApp-700.14

Swift 3

import Foundation
import UIKit

extension UIView {
    func snapshotView() -> UIView? {
        guard let image = snapshotImage() else { return nil }
        return UIImageView(image: image)
    }

    func snapshotImage() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, contentScaleFactor)
        defer { UIGraphicsEndImageContext() }

        drawHierarchy(in: bounds, afterScreenUpdates: false)

        return UIGraphicsGetImageFromCurrentImageContext()
    }
}