9

を使用してカメラズームを実装しようとしていCGAffinetransformます。Transform は問題ありませんが、より大きなサイズにスケーリングすると、 に割り当てたフレームからはみ出してしまいAVCaptureVideoPreviewLayerます。masksToBoundsプロパティをに設定しようとしましYESたが、役に立ちませんでした。

フレーム内に収めることはできますか?

編集:
私が望むのは、カメラプレビューレイヤーの特定の領域を指定できることです。スケーリング変換を適用すると(つまり、プレビューレイヤーのフレームが拡張されます)、指定された領域の外側のレイヤーの部分が切り取られます.

4

3 に答える 3

38

スケーリングしているレイヤーを別のレイヤー内に配置し、代わりにそのレイヤーをマスクする必要があります(スーパーレイヤー)。同じことがビューでも機能します。

つまり、 2 つのビュー/レイヤーがclippingViewありますscalingView。scalingView は clippingView のサブビューであり、clippingView は実際にその境界にクリップするビューです。

[clippingView addSubview:scalingView];
clippingView.clipsToBounds = YES;

またはレイヤーを使用する

[clippingLayer addSublayer:scalingLayer];
clippingLayer.masksToBounds = YES;
于 2013-01-09T15:10:18.720 に答える
4

皆さんは部分的に正しいと思いますが、明確にしたかったのです。

AVCaptureVideoPreviewLayer のようなものをビューに追加したとしましょう[self.view.layer addSublayer:previewLayer]

  1. [self clipsToBounds] は、プライマリ レイヤーに境界をマスクするように指示するまで何もしません。[self.view.layer masksToBounds];

  2. ビューにフレームがあり、そのレイヤーもあるからといって、境界があるとは限りません。境界がない場合、マスクするものは何もありません。これを行いますself.view.layer.bounds = self.view.frame

だから、すべて一緒にここに..自分のUIViewクラスでこれを行ったので、self.viewを呼び出す必要がないことに注意してください。

previewLayer.bounds = self.frame;
self.layer.bounds = self.frame;

self.layer.masksToBounds = YES;
previewLayer.masksToBounds = YES;

[self setBounds:self.frame];
[self clipsToBounds];
于 2015-01-22T00:32:22.640 に答える
0

clipsToBoundsレイヤーを追加するビューのプロパティは、に設定されている必要がありますYES

于 2013-01-10T11:59:05.230 に答える