如何在CALayer中定位内容以使其缩放以适应宽度(保留纵横比)并位于图层的顶部?
更具体地说,我正在尝试使用AVCaptureVideoPreviewLayer实现此定位。如果我将预览图层的videoGravity设置为AVLayerVideoGravityResizeAspectFill,那么它会填充宽度,但会在框架中垂直居中(切掉顶部和底部)。
答案 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];
}