У меня есть вид SceneKit, который заполняет мой экран. Моя цель - позволить пользователям делать снимки этой сцены, но снимки - это не весь экран, а часть вставки в UIImageView, которая немного меньше экрана. В идеале, пользователь не должен замечать, изображение сверху должно быть идентично изображаемому за ним месту.Обрезание изображений пользовательского интерфейса
Я закодировал это, используя snapshot
и cropped
, но, как вы можете видеть на картинке, масштаб заканчивается - см. Ширину желтой линии и размер окна? Он также неправильно расположен, он немного вниз и влево от того места, где он должен быть - верхний левый должен быть ниже линии окон, но вы можете видеть, что он находится на крыше над ними. Я не вижу оригинальный снимок, потому что отладчик QuickLook отказывается его показывать.
Там не много коды к ней, кто видят проблему:
let background = sceneView.snapshot().cgImage!
let cropped = background.cropping(to: overlayView.frame)
UIGraphicsBeginImageContextWithOptions(overlayView.frame.size, false, 1.0)
let context = UIGraphicsGetCurrentContext()
context!.setAlpha(0.50)
context!.draw(cropped!, in: overlayView.bounds)
let transparent = context!.makeImage();
UIGraphicsEndImageContext()
overlayView.image = UIImage.init(cgImage: transparent!, scale: 1.0, orientation: .downMirrored)
Я пробовал различные масштабы и прямоугольники безрезультатно. Я предполагаю, что это очень легко.
ОБНОВЛЕНИЕ: После нескольких попыток я смог получить quicklook для работы. Снимок действительно весь фон, как я ожидал. Но он намного больше, чем я ожидал - его 640, 998, а обрезанная версия - 228, 304. Это объясняет «масштабирование». Это заставляет меня думать, что размер рамки вставки в виде НЕ является прямой зависимостью от размера изображения. Это звонит какие-то колокольчики? Есть ли какой-нибудь другой прямоугольник, который я должен использовать, а не overlayView.frame?
Пробовали ли вы настройку contentMode представления? Кроме того, вы можете попробовать установить jitteringEnabled = true. Затем выключите его после моментального снимка. Снимок будет более качественным, но недостатком является то, что есть штраф за производительность. – sambro
Можете ли вы быть более конкретным в contentMode? Это похоже на то, что я должен попробовать. Также см. Обновление. –
Ну, я смог получить результаты намного ближе, просто умножив границы на 2. Любая идея, почему? –