NSWindow setFrame |setPosition на экране - PullRequest
0 голосов
/ 25 февраля 2011

В моем приложении мне нужно отображать несколько окон одного и того же NIB одновременно, и оно будет закрываться / освобождаться по таймеру,

все работает нормально, кроме положения окна. Мое требование: оно должно отображать окно точно под предыдущим окном, я могу рассчитать источник для нового окна, если присутствует какое-либо окно с тем же NIB.

Я использую эту функцию для получения источника:

-(void)awakeFromNib{  

    NSString *eventMsg = [NSString stringWithFormat:@"%s is set “,eventName];  
    [pTextField setStringValue:eventMsg];

    [pWindow setFrameOrigin:[self pointstoDisplayScreen]];

    /* On timer callback , i will show the fadeout and fadein effects*/
    [self startTimer];
}     

/* This method returns the coordinate where to 
   draw the window 
 */
-(NSPoint)pointstoDisplayScreen{
    NSRect frame = [[NSScreen mainScreen] visibleFrame];
    NSRect windowRect = [pWindow frame];

    CGFloat yCoordinate = frame.size.height-windowRect.size.height;

    NSPoint point = NSMakePoint(frame.size.width - windowRect.size.width, frame.size.height-windowRect.size.height);

    /* Let there be some gap, if any window present and let it draw below to 
       the existing window 
     */
    point.y -=  (windowRect.size.height + windowOffset)*noOfWindow;
    NSLog([NSString stringWithFormat:@"PositionToDisplayScreen x = [%f] y = [%f]",point.x,point.y ]);

    return point;
}

Проблема в том, что, если предыдущее окно присутствует, оно рисует новую точку, немного ниже и в правой части существующего окна,

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

Ответы [ 2 ]

2 голосов
/ 26 февраля 2011
[NSWindowController setShouldCascadeWindows:NO]; 

Установив это, он работает, теперь все уведомления рисуются в правом верхнем углу экрана.
Благодарю.

0 голосов
/ 25 февраля 2011

Ваше местоположение в окне "прыгает", потому что вы не выполняете никаких проверок границ, чтобы определить, что вычисленный новый источник находится в пределах экрана.

Класс NSScreen предоставит вам подробную информацию об экранах, для каждого из которых вы не можете получить frame.

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

Вооружившись рамками экрана и алгоритмом движения, вы можете рассчитать свое новое происхождение.

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