需要更改CALayer类对象的大小和位置

时间:2014-02-18 08:25:01

标签: ios iphone objective-c uiview calayer

我正在尝试复制Apple提供的名为AVCam的示例应用的所有功能:https://developer.apple.com/library/ios/samplecode/AVCam/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010112-Intro-DontLinkElementID_2

我遇到的唯一问题是改变UIView对象的大小和位置。问题是我使用的是Apple的示例代码而且对我来说没有意义。

Apple提供了我称之为MediaCapturePreviewView的示例VC。这是头文件代码:

#import <UIKit/UIKit.h>

@class AVCaptureSession;

@interface MediaCapturePreviewView : UIView

@property (nonatomic) AVCaptureSession *session;

@end

这是主文件代码:

#import "MediaCapturePreviewView.h"
#import <AVFoundation/AVFoundation.h>

@implementation MediaCapturePreviewView

- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

+ (Class)layerClass
{
    return [AVCaptureVideoPreviewLayer class];
}

- (AVCaptureSession *)session
{
    return [(AVCaptureVideoPreviewLayer *)[self layer] session];
}

- (void)setSession:(AVCaptureSession *)session
{
    [(AVCaptureVideoPreviewLayer *)[self layer] setSession:session];
}


@end

然后在我的应用程序的中央视图控制器中,我导入了我刚刚向您展示的“MediaCapturePreviewView”的头文件。最后但并非最不重要的是,在我的中央视图控制器的主文件中,我在界面区域中有一个IBOutlet,如下所示:

@property (nonatomic, weak) IBOutlet MediaCapturePreviewView *previewView;

上面的IBOutlet已连接到Interface Builder中的UIView对象,该对象覆盖整个iPhone屏幕。

然后,这里有一个小例子,说明当你点击“拍照”按钮时如何使用previewView:

- (IBAction)snapStillImage:(id)sender
{
    dispatch_async([self sessionQueue], ^{
        // Update the orientation on the still image output video connection before capturing.
        [[[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo] setVideoOrientation:[[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] connection] videoOrientation]];

我尝试在上面的方法调用之后立即添加此代码,但它没有帮助:

_previewView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.frame.size.height/2);

我知道您可以编辑CALayer类对象的属性,例如框架,边界和位置,但我只是卡住了,不知道我需要在哪里编辑这些东西。

这是当前UIView拍照时的样子:

enter image description here

这就是我需要的样子:

enter image description here

我基本上需要它才能占据iPhone屏幕的前50%。

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

视频的默认捕获率适合iPhone的屏幕。如果您尝试将其缩放到不同的比例(例如半屏幕),则会出现扭曲的图像或裁剪的图像。

为了实现您想要做的事情,我认为用UIView包含您想要的控件(例如拍摄照片按钮)然后覆盖屏幕的一半会更容易只需将捕获的全屏图像裁剪为其大小的一半:

CGRect clippedRect  = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height/2.0);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], clippedRect);
UIImage *newImage   = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);