NSWindow setFrame |屏幕上的setPosition

时间:2011-02-25 17:22:51

标签: objective-c cocoa nswindow nswindowcontroller

在我的应用程序中,我需要一次显示一个相同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 个答案:

答案 0 :(得分:2)

[NSWindowController setShouldCascadeWindows:NO]; 

通过设置它,它的工作,现在所有通知绘制在屏幕的右上角 谢谢。

答案 1 :(得分:0)

您的窗口位置是“跳跃”,因为您没有进行任何边界检查以确定计算出的新原点是否在屏幕边界内。

课程NSScreen会为您提供有关屏幕的详细信息,因为每个屏幕都无法获取frame

现在你需要决定你想要一个窗口原点移动的方式;例如到屏幕边缘,没有进一步,在相邻的屏幕上,如果有一个,包裹(右边意味着左边),等等。选择取决于你的应用。

使用屏幕框架和移动算法,您可以计算新的原点。