Переместить NSView над окном, используемым фреймворком DVDPlayback - PullRequest
2 голосов
/ 28 марта 2012

Я пытаюсь написать простой DVD-плеер с использованием Mac OS X's DVDPlayback.framework. Я могу заставить DVD проигрываться в окне, но в конечном итоге я хочу, чтобы он работал как полноэкранное приложение.

У меня возникают трудности при добавлении дополнительного вида для отображения элементов управления мультимедиа во время воспроизведения DVD-диска (пауза / воспроизведение, бегунок для просмотра фильма, смена главы и т. Д.).

Похоже, что если я создаю вложенный вид (NSView) в окне, используемом каркасом DVD, он всегда, кажется, отстает от содержимого DVD, даже если я скажу NSView находиться на самый верхний уровень.

Вот упрощенный код, который просто пытается создать белый подвид в области окна:

(я пробовал код на 10.6 и 10.7 с теми же результатами).

const BOOL PLAY_DVD = YES;

@interface ControlsView : NSView {
}
@end

@implementation ControlsView
- (void)drawRect:(NSRect)rect {
    [[NSColor whiteColor] set];
    NSRectFill(rect);
}
@end

@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSView *view = self.window.contentView;

    if (PLAY_DVD) {
        NSLog(@"%@ Playing DVD video", [self class]);
        // Register error handler
        OSStatus err;

        err = DVDInitialize();
        if (err != noErr) {
            NSLog(@"DVDInitialise failed with error code %d", err);
            [NSApp terminate:self];
        }

        // Set window to be the main window
        err = DVDSetVideoWindowID([self.window windowNumber]);

        // Set the display...
        CGDirectDisplayID display = (CGDirectDisplayID) [[[[self.window screen] deviceDescription] valueForKey:@"NSScreenNumber"] intValue];
        Boolean isSupported;
        err = DVDSwitchToDisplay(display, &isSupported);

        // Set video bounds
        NSRect frame = [self.window frame];
        CGRect rect = CGRectMake(0, 0, frame.size.width, frame.size.height);
        err = DVDSetVideoCGBounds(&rect);

        FSRef ref;
        DVDOpenMediaFileWithURL([NSURL URLWithString:@"file:///Path/to/my/TestDVD/VIDEO_TS"]);
        DVDOpenMediaFile(&ref);

        DVDPlay();
    }

    // Attempt to add a subview to show the controls...
    ControlsView *controls = [[ControlsView alloc] initWithFrame:NSMakeRect(20, 20, 100, 50)];
    [view addSubview:controls positioned:NSWindowAbove relativeTo:nil];
}
@end

Если PLAY_DVD равно NO, подпредставление корректно отображается (и я могу создать другие подпредставления и показать, что порядок правильный).

Если PLAY_DVD равно YES, мультимедиа начинает воспроизводиться, но вспомогательный вид никогда не виден, потому что кажется, что он всегда отстает от видео.

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

Кто-нибудь знает, как лучше это сделать? Должны ли мои полноэкранные элементы управления находиться в отдельном окне, которое находится над полноэкранным окном? Мне не удалось найти пример, в котором элементы управления и воспроизведение DVD находятся в одном окне.

Заранее спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...