UIView рамки границ приходит как 0,0 - PullRequest
4 голосов
/ 12 декабря 2011

Среда: Xcode 4, ios 5, ipod touch 4-го поколения с дисплеем Retina

Я пытаюсь написать простое приложение, которое показывает предварительный просмотр видео и делает снимок. Для показа предварительного просмотра я использую следующий код:

  // 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, подключенный к раскадровке UIView на IB, и он занимает весь экран. Однако рамка всегда печатается как 0,0,0,0 (x, y, h, w). Может кто-нибудь, пожалуйста, скажите мне, что идет не так?

Есть еще несколько строк кода, которые устанавливают вывод и запускают сеанс. Однако к этому времени кадр уже неправильный. Интересно, что я вижу предварительный просмотр видео, однако он показывает в портретной ориентации, где мое приложение полностью в альбомной ориентации.

Ответы [ 2 ]

10 голосов
/ 12 декабря 2011

Каким способом вы печатаете рамку? Есть большая вероятность, что UIView либо не был создан в той точке кода, где вы печатаете, либо, по крайней мере, он не был автоматически измерен системой.

Я бы порекомендовал проверить кадр другим способом, как только на экране появится фактический вид, как в viewDidAppear:

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

Обратите внимание, что гораздо проще использовать методы NSStringFromXXX для вывода значения примитивной структуры, а не обращаться к значениям по отдельности.

4 голосов
/ 12 декабря 2011

Скорее всего, этот код выполняется в методе init до того, как представление фактически было загружено из файла NIB.Поэтому, когда вы вызываете self.vPreview.bounds, self.vPreview фактически равен нулю, давая нулевое возвращаемое значение CGRect.

С помощью UIViewController представление загружается лениво, поэтому, пока что-то не запрашивает свойство представления, пероне был загружен.

Вы должны выполнить настройку вида в методе -viewDidLoad.Он вызывается после загрузки пера, и все ваши подключенные IBOutlets будут отличны от нуля.

...