将内容定位在CALayer中

时间:2013-01-30 22:57:46

标签: ios objective-c calayer avcapture

如何在CALayer中定位内容以使其缩放以适应宽度(保留纵横比)并位于图层的顶部?

更具体地说,我正在尝试使用AVCaptureVideoPreviewLayer实现此定位。如果我将预览图层的videoGravity设置为AVLayerVideoGravityResizeAspectFill,那么它会填充宽度,但会在框架中垂直居中(切掉顶部和底部)。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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;
}

答案 2 :(得分:0)

我通常使用autolayout进行此操作:

-(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];
}