2015-08-09 3 views
0

Objective-C desktop Cocoa ap. Приложение представляет собой очень специфический краевой регистр (автономный киоск с одноконтактным интерфейсом). Я упоминаю это первым в надежде избежать лекции HIG. ;)Как отображать модальный лист в полноэкранном режиме NSWindow без визуального переключения окна хоста?

Я использую модальный вид листа, чтобы отобразить документ PDF поверх моего обычного содержимого. Код очень прост:

[docViewerHostWindow beginSheet:docViewer completionHandler:nil]; 

DocViewerHostWindow является NSWindow доступа как родитель NSView, который вызывает лист. Если это имеет значение, «docViewer» является подклассом NSWindow, содержащим PDFView.

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

вхожу полноэкранным так:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO],NSFullScreenModeAllScreens,nil]; 

[self enterFullScreenMode:[NSScreen mainScreen] withOptions:options]; 

Этот основной NSLog иллюстрирует проблему:

NSLog(@"Before: %f,%f",docViewerHostWindow.frame.origin.x,docViewerHostWindow.frame.origin.y); 

[docViewerHostWindow beginSheet:docViewer completionHandler:nil]; 

NSLog(@"After: %f,%f",docViewerHostWindow.frame.origin.x,docViewerHostWindow.frame.origin.y); 

**Log when running windowed (same origin before and after) ** 
2015-08-09 22:52:46.641 Before: 311.000000,491.000000 
2015-08-09 22:52:47.050 After: 311.000000,491.000000 

**Log when running fullscreen (origin shifts in fullscreen) ** 
2015-08-09 22:52:46.641 Before: 0.000000,0.000000 
2015-08-09 22:52:47.050 After: 80.000000,-23.000000 

I HAV e попытался заставить источник окна как до, так и после открытия листа, но это не помогло. Я даже не уверен, где искать - какие-либо подсказки о том, что вызывает это и почему?


Update: Чтобы быть ясно, что я не говорю об анимации по умолчанию на самом листе (как описано в this question), а это то, что происходит с окном хозяина, но только в полноэкранном режиме.

+0

Поддерживаете ли вы свой док в левой части экрана? Эти цифры выглядят как окно, расположенное, чтобы избежать док-станции и панели меню. Если Dock - это позиция, в которой находилось окно, прежде чем вы разместите представление в полноэкранном режиме? –

+0

Ах! Это именно то, что есть ... если я переведу док-станцию ​​на дно, содержимое окна сместится вместо правого. Я все еще не уверен, как отключить это поведение, и я не уверен, почему это происходит на вторичных мониторах, а также на первичных (поскольку там нет док-станции). Дает мне хорошее преимущество, но, спасибо. – andrew

+0

@KenThomases Я собираюсь отредактировать вопрос, чтобы включить ответ, который я нашел (с помощью формы вашего понимания) в отношении режима киоска. Я все еще думаю, что должен быть способ избежать этого (кажется странным уклоняться от невидимой док-станции в полноэкранном режиме), но если у кого-то еще нет идей, и вы хотели бы написать это как ответ, я соглашусь с ним. Спасибо за вашу помощь! – andrew

ответ

0

Проблема, по-видимому, связана с окном, избегающим док-станции.

Я думаю, что это также связано с тем, что вы помещаете представление, а не окно, в полноэкранном режиме. Когда вы это делаете, вид как бы выведен из нормального окна. Но тогда, когда вы начинаете лист в окне просмотра, вы возвращаете его обратно в картинку, так сказать. (Вы можете проверить, действительно ли свойство window вида является тем же окном, которое было до того, как оно вступило в полноэкранный режим. Если это не так, вы действительно не имеете дело с прикреплением к нему листа.)

Я бы порекомендовал вам использовать окно без полей, расположенное для покрытия экрана, на уровне окна NSStatusWindowLevel + 1. Это методика, рекомендованная в Apple OpenGL Programming Guide for Mac: Drawing to the Full Screen (что, по общему признанию, несколько отличается от контекста, в котором вы работаете). Таким образом, вы не использовали бы -[NSView enterFullScreenMode:withOptions:]. Если вы хотите установить presentationOptions приложения для поведения типа киоска, вы также можете это сделать.

+0

Что касается окна, у меня есть код на месте, чтобы убедиться, что я прикрепляю лист к фактическому окну (который отличается в полноэкранном и оконном режимах), но я оставил это вне вопроса выше. В любом случае я принимаю ответ, потому что он решит проблему. Тем временем я также открыл способ динамического переключения режимов киоска и написал ниже. Еще раз спасибо! – andrew

0

Эффект, видимый, является приложением, перемещающимся с пути (невидимой) док-станции и панели меню (спасибо @KenThomases, чей комментарий помог это понять).В дополнение к принятому ответу выше, я нашел другое решение:

Apple предлагает ряд kiosk mode tricks, которые полезны здесь, в частности, обратите внимание на их пример относительно сокрытия меню и док-станции, добавив код в awakeFromNib.

Однако, это не идеальный вариант в не-киоске ap, нам бы хотелось, чтобы параметры киоска были доступны только в полноэкранном режиме. К счастью, это возможно, передав опции enterFullScreenMode: withOptions :. Параметры режима регулярного представления восстанавливается, когда мы exitFullScreenMode: withOptions

документация немного тонкая, но это сделали трюк:

NSApplicationPresentationOptions kioskOptions = NSApplicationPresentationHideDock + NSApplicationPresentationHideMenuBar; 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:NO],NSFullScreenModeAllScreens, 
         [NSNumber numberWithInteger:kioskOptions],NSFullScreenModeApplicationPresentationOptions, nil]; 

[self enterFullScreenMode:[NSScreen mainscreen] withOptions:options]; 
Смежные вопросы