1

CALayer でコンテンツを配置して、幅に合わせて拡大縮小し (アスペクト比を維持)、レイヤーの上部に配置するにはどうすればよいですか?

より具体的には、AVCaptureVideoPreviewLayer を使用してこのポジショニングを達成しようとしています。プレビュー レイヤーの videoGravity を AVLayerVideoGravityResizeAspectFill に設定すると、幅がいっぱいになりますが、コンテンツがフレームの垂直方向の中央に配置されます (上部と下部が切り取られます)。

4

3 に答える 3

2

.contentGravity プロパティを使用してみてください -

レイヤーのコンテンツがその境界内でどのように配置またはスケーリングされるかを指定する定数

<CALayer>.contentsGravity = kCAGravityResizeAspect;

可能

CA_EXTERN NSString * const kCAGravityCenter
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityTop
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityBottom
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityLeft
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityRight
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityTopLeft
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityTopRight
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityBottomLeft
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityBottomRight
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityResize
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityResizeAspect
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCAGravityResizeAspectFill
    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
于 2015-07-31T07:09:57.587 に答える
0

次のコード セットを使用してみてください。

次の行をレイヤーの初期レイアウトに追加します。

[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

次に、これらを追加します。

- (void) viewDidLayoutSubviews
{
    [self layoutPreviewInView:_photoImageView];
}

-(void)layoutPreviewInView:(UIView *) aView
{
    AVCaptureVideoPreviewLayer *layer = [self previewInView:aView];
    if (!layer) return;

    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    CATransform3D transform = CATransform3DIdentity;
    if (orientation == UIDeviceOrientationPortrait) ;
    else if (orientation == UIDeviceOrientationLandscapeLeft)
        transform = CATransform3DMakeRotation(-M_PI_2, 0.0f, 0.0f, 1.0f);
    else if (orientation == UIDeviceOrientationLandscapeRight)
        transform = CATransform3DMakeRotation(M_PI_2, 0.0f, 0.0f, 1.0f);
    else if (orientation == UIDeviceOrientationPortraitUpsideDown)
        transform = CATransform3DMakeRotation(M_PI, 0.0f, 0.0f, 1.0f);

    layer.transform = transform;
    layer.frame = aView.bounds;
}

-(AVCaptureVideoPreviewLayer *) previewInView: (UIView *) view
{
    for (CALayer *layer in view.layer.sublayers)
    {
        if ([layer isKindOfClass:[AVCaptureVideoPreviewLayer class]])
            return (AVCaptureVideoPreviewLayer *) layer;
    }
    return nil;
}
于 2013-02-04T18:07:57.953 に答える
0

私は通常、自動レイアウトとこれでそれを行います:

-(void)awakeFromNib{
  [super awakeFromNib];
  self.backgroundColor = [UIColor clearColor];
  CAGradientLayer* gradient = (CAGradientLayer*) self.layer;
  gradient.frame = self.bounds;
  gradient.colors = [NSArray arrayWithObjects:
                     (id)[UIColor colorWithRed:0 green:0 blue:0 alpha:0].CGColor,
                     (id)[UIColor colorWithRed:0 green:0 blue:0 alpha:1].CGColor, nil];

}

+ (Class) layerClass {
  return [CAGradientLayer class];
}
于 2015-07-31T11:43:31.927 に答える