2017-01-31 4 views
1

У меня есть вид SceneKit, который заполняет мой экран. Моя цель - позволить пользователям делать снимки этой сцены, но снимки - это не весь экран, а часть вставки в UIImageView, которая немного меньше экрана. В идеале, пользователь не должен замечать, изображение сверху должно быть идентично изображаемому за ним месту.Обрезание изображений пользовательского интерфейса

Я закодировал это, используя snapshot и cropped, но, как вы можете видеть на картинке, масштаб заканчивается - см. Ширину желтой линии и размер окна? Он также неправильно расположен, он немного вниз и влево от того места, где он должен быть - верхний левый должен быть ниже линии окон, но вы можете видеть, что он находится на крыше над ними. Я не вижу оригинальный снимок, потому что отладчик QuickLook отказывается его показывать.

enter image description here

Там не много коды к ней, кто видят проблему:

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?

+0

Пробовали ли вы настройку contentMode представления? Кроме того, вы можете попробовать установить jitteringEnabled = true. Затем выключите его после моментального снимка. Снимок будет более качественным, но недостатком является то, что есть штраф за производительность. – sambro

+0

Можете ли вы быть более конкретным в contentMode? Это похоже на то, что я должен попробовать. Также см. Обновление. –

+0

Ну, я смог получить результаты намного ближе, просто умножив границы на 2. Любая идея, почему? –

ответ

0

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

let croprect = CGRect(x: overlayView.frame.origin.x * 2, y: overlayView.frame.origin.y * 2 - 45, width: overlayView.frame.width * 2, height: overlayView.frame.height * 2) 
    let drawrect = CGRect(x: 0, y: 0, width: overlayView.frame.width * 2, height: overlayView.frame.height * 2) 
    let background = sceneView.snapshot() 
    let cropped = background.cgImage!.cropping(to: croprect) 
    UIGraphicsBeginImageContextWithOptions(drawrect.size, false, 0.0) 
    let context = UIGraphicsGetCurrentContext() 
    context!.setAlpha(0.50) 
    context!.draw(cropped!, in: drawrect) 
    let transparent = context!.makeImage(); 
    UIGraphicsEndImageContext() 

Я чрезвычайно любопытно, почему я должен был настроить Y отправную точку, чтобы заставить их выстраиваться, кто есть идея?

+0

Вызов BeginImageContext с третьим параметром '0' является огромным улучшением. Я не могу представить, что вы считали, что вы произвольно устанавливаете масштаб в '1' в вашем исходном коде ... – matt

+0

Пример кода. Но он не имел визуального эффекта в 1 или 0, я пробовал оба варианта в обоих местах. –

Смежные вопросы