UIView的frame和bounds返回值均为0?

6

环境:Xcode 4,iOS 5,带有视网膜显示屏的iPod Touch第四代

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

  // 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
只是一条注释:要记录一个 CGRect,可以使用这个方法 NSLog(@"%@",NSStringFromCGRect(self.vPreview.bounds)); - NJones
谢谢NJones,我会用的。我还在从C++世界转变过来。 - Kiran
2个回答

10
你是用什么方法打印框架的?很有可能UIView在你打印代码的时候还没有被创建,或者至少系统还没有自动调整它的大小。我建议在另一个方法中检查框架,等到实际视图已经出现在屏幕上,比如在viewDidAppear:中。
- (void)viewDidAppear {
    NSLog(@"View frame is: %@", NSStringFromCGRect(self.vPreview.frame));
    [super viewDidAppear];
}

请注意,使用NSStringFromXXX方法打印基本结构的值要比逐个访问值容易得多。


5
很可能此代码正在init方法中运行,此时视图尚未从NIB文件加载。因此当您调用self.vPreview.bounds时,self.vPreview实际上是nil,导致返回零CGRect值。
对于UIViewController,视图是惰性加载的,因此直到有东西请求视图属性时,才会加载nib。
您应该在-viewDidLoad方法中进行视图自定义。这是一次Nib已经加载后被调用的,并且所有连接的IBOutlets将不为nil。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接