UIView框架边界为0,0

时间:2011-12-11 23:15:13

标签: iphone uiview ios5 ipod avcapturesession

环境:Xcode 4,ios 5,ipod touch第4代带视网膜显示器

我正在尝试编写一个显示视频预览并拍摄照片的简单应用。为了显示预览,我使用以下代码:

  // Create the session
    session = [[AVCaptureSession alloc] init];

    // Set preset to the highest available
    session.sessionPreset = AVCaptureSessionPresetPhoto;

    // Give the frame for preview
    CALayer *viewLayer = self.vPreview.layer;
    NSLog(@"viewLayer = %@", viewLayer);

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = 
    [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    captureVideoPreviewLayer.frame = self.vPreview.bounds;

    NSLog(@"Bounds: x:%d, y:%d,height:%d,width:%d",
          self.vPreview.bounds.origin.x,self.vPreview.bounds.origin.y,
          self.vPreview.bounds.size.height, self.vPreview.bounds.size.width);



    [self.vPreview.layer addSublayer:captureVideoPreviewLayer];

    // Get AV Device
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error = nil;

    // Add Input from the above device
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if ( !input ) NSLog(@"ERROR: trying to open camera: %@", error);

    [session addInput:input];

我将vPreview连接到IB故事板上的UIView,它占据了全屏。但是,帧始终打印为0,0,0,0(x,y,h,w)。有人可以告诉我出了什么问题吗?

还有更多的代码行可以设置输出并运行会话。但是,到目前为止,框架已经错了。有趣的是,我可以看到视频预览,但它以纵向显示,因为我的应用程序都是风景。

2 个答案:

答案 0 :(得分:10)

您打印框架的方法是什么?很可能在你正在进行打印的代码中没有创建UIView,或者至少它没有被系统自动调整大小。

我建议在屏幕上显示实际视图后,在另一种方法中检查框架,例如viewDidAppear:

- (void)viewDidAppear {
    NSLog(@"View frame is: %@", NSStringFromCGRect(self.vPreview.frame));
    [super viewDidAppear];
}

另请注意,使用NSStringFromXXX方法打印基本结构的值更容易,而不是单独访问值。

答案 1 :(得分:4)

在从NIB文件实际加载视图之前,很可能此代码在init方法中运行。因此,当您致电self.vPreview.bounds时,self.vPreview实际上为零,给出的CGRect返回值为零。

使用UIViewController时,视图会被懒惰地加载,因此在有人要求查看属性之前,还没有加载nib。

您应该使用-viewDidLoad方法进行视图自定义。一旦加载了笔尖就会调用它,并且所有连接的IBOutlet都将是非零的。