私は画面をいっぱいにするSceneKitビューを持っています。私の目標は、ユーザーがそのシーンのスナップショットを撮ることですが、スナップショットは画面全体ではなく、画面より少し小さいUIImageViewのインセット部分です。理想的には、ユーザは気付かないでください。上の画像は、その背後の画像と同じである必要があります。UIイメージを切り取る
snapshot
とcropped
を使ってこれをコーディングしましたが、画像でわかるように、縮尺が途切れてしまいます - 黄色の線の幅とウィンドウのサイズはどうですか?また、それは正しく配置されていない、それは多少ダウンして左からそれがある必要があります - 左上はウィンドウのラインの下にあるはずですが、あなたはそれがそれらの上の屋根上にあることがわかります。デバッガのQuickLookが表示を拒否したため、元のスナップショットが表示されません。私は無駄にさまざまなスケールとrectsを試してみました
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)
:それへの多くのコードはありません
は、誰もが問題を参照してください。私はこれが非常に簡単だと思います。
更新:何回か試してみたら、私はクイックビューを動作させることができました。スナップショットは、私が期待するように、実際にはバックグラウンド全体です。しかし、それは私が予想しているよりもはるかに大きくなっています - その640、998、切り取ったバージョンは228、304です。それは "ズーム"を説明しています。これは、インセットビューのフレームサイズがであり、画像サイズとは直接の関係ではないと考えています。それはどんな鐘を鳴らしますか?私はoverlayView.frameよりむしろ使用しなければならないいくつかの他のrectですか?
ビューのcontentModeを設定しようとしましたか?また、jitteringEnabled = trueを設定してみてください。その後、スナップショットの後でオフにします。スナップショットイメージの品質は向上しますが、パフォーマンス上のペナルティがあるという欠点があります。 – sambro
contentModeをより具体的にすることはできますか?それは私が試してみるべきもののように聞こえる。また、更新を参照してください。 –
まあ、私は結果を2の倍数で単純に近づけることができました。どんな考えですか? –