Видимый кадр NSScreen слишком велик

#objective-c #cocoa #macos #applescript

#objective-c #cocoa #macos #applescript

Вопрос:

Мне нужны границы моего экрана, чтобы знать наименьшие и наибольшие координаты x / y. Мое разрешение экрана 1440х900. Когда я запрашиваю у NSScreen видимый кадр, т.Е.

 NSRect frame = [[NSScreen mainScreen] visibleFrame]
  

Я получаю следующие значения x / y:

 xMin = NSMinX(frame) // 74
yMin = NSMinY(frame) // 0
xMax = NSMaxX(frame) // 1440
yMax = NSMaxY(frame) // 878
  

У меня док-станция с левой стороны, поэтому мой xMin больше 0, а yMin равен 0. Однако проблема заключается в yMax. Насколько я могу судить, высота строки меню составляет 44 пикселя, таким образом, yMax должен составлять 900 — 44 = 856 пикселей. Согласно NSScreen, строка меню может занимать не более 22 пикселей. Как это?


Дополнительная информация о моем варианте использования: я настраиваю положения окон и их размеры с помощью Applescript. Чтобы узнать, какие значения разрешены, то есть внутри видимого кадра, мне нужно свериться с видимым кадром NSScreen. Однако NSScreen начинает подсчет пикселей с нижнего левого, в то время как Applescript начинается с верхнего левого. В процессе построения метода для NSScreen для возврата его координаты из верхнего левого угла я столкнулся с этой проблемой.

Преобразованный видимый кадр имеет yMin 22, таким образом, 22 пикселя от верхней границы. Я экспериментировал непосредственно с Applescript и обнаружил, что каждый yMin ниже 44 будет скорректирован на 44, поскольку строка меню занимает пространство от 0 до 43 пикселей.


Надеюсь, мое объяснение не было слишком запутанным. В итоге проблема заключается в том, что эксперименты показывают, что строка меню имеет высоту 44 пикселя, в то время как NSScreen оставляет свободными только 22 пикселя для строки меню (поскольку ее высота составляет 878 пикселей на экране с разрешением 900 пикселей).


РЕДАКТИРОВАТЬ: Высота строки меню составляет 22 пикселя. Это проблема finder в том, как он обрабатывает события, касающиеся его bounds-свойства.

Комментарии:

1. Высота моей строки меню составляет 22 пикселя (или что-то в этом диапазоне). Определенно не 44.

Ответ №1:

Строка меню имеет размер 22 пикселя. В качестве теста откройте TextEdit, переместите его окно в верхнюю часть экрана, а затем запустите этот applescript, и вы увидите, что оно равно 22.

 tell application "TextEdit"
    bounds of window 1
end tell
  

Проблема, которую вы видите, заключается в том, как Finder измеряет свои окна. В 10.6 что-то изменилось. Кажется, что строка заголовка Windows не учитывается Finder, и, таким образом, видимая позиция 0 окна — это не верхний левый угол, а на несколько пикселей ниже этой позиции. Я также прописываю позиции окон и замечаю, что мой код должен отличаться между 10.5 и 10.6. В качестве примера откройте окно Finder и переместите его в верхнюю часть экрана, а затем запустите этот код … он показывает 44.

 tell application "Finder"
    bounds of window 1
end tell
  

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

 tell application "System Events"
    tell process "Finder"
        set s to size of window 1
        set p to position of window 1
        return {p, s}
    end tell
end tell
  

Комментарии:

1. Вы правы, я использовал свойство «bounds» для установки и чтения положения окна Finder. Свойства «размер» и «положение» работают по назначению, но требуют включения опции специальных возможностей. Однако я сам экспериментировал с различными приложениями и обнаружил, что окна Xcode будут начинаться с нижнего левого угла, если используется свойство bounds, и с верхнего левого угла, если используются свойства position / size. Похоже, мне нужно выбрать размер / положение…