2013-01-30 9 views
1

Как разместить содержимое в CALayer так, чтобы оно масштабировалось в соответствии с шириной (сохраняя пропорции) и располагалось в верхней части слоя?Размещение содержимого в CALayer

В частности, я пытаюсь достичь этого позиционирования с помощью AVCaptureVideoPreviewLayer. Если я установил videoGravity слоя предварительного просмотра в AVLayerVideoGravityResizeAspectFill, он заполнит ширину, но центрирует содержимое по вертикали в кадре (отсекая верх и низ).

ответ

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

Попробуйте использовать .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); 
+0

пальца вверх для этого просто ответ! –

+0

kCAGravityResizeAspect может не заполнять всю ширину (в зависимости от высоты). kCAGravityResizeAspectFill выравнивает центры - не вверх. Поэтому мне все еще интересно, как иметь kCAGravityResizeAspectFill и топ. – tcurdt

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]; 
} 
Смежные вопросы