• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Setting the position of new windows
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Setting the position of new windows


  • Subject: Re: Setting the position of new windows
  • From: Seth Willits <email@hidden>
  • Date: Thu, 14 Mar 2013 18:51:46 -0700



On Mar 14, 2013, at 8:13 AM, Steve Mills wrote:

> On Mar 13, 2013, at 17:29:11, Seth Willits <email@hidden> wrote:
>
>> On Mar 13, 2013, at 2:38 PM, Steve Mills wrote:
>>
>>> That's an idea. I was hoping there was some way to say "this is the frame for the first new window, but all others should respect it AND then go ahead and cascade down from there," because I'd still like to cascade the windows from that calculated position but hopefully without having to write all the code that Apple already wrote to cascade windows and ensure that they's still 100% onscreen in the first place.
>>
>> The exact behavior you describe is the behavior I see when simply setting the window frame in windowDidLoad.
>
> It's hard to say "exact" without seeing each other's app. So #1 gets put into the location I calculate. #2 cascades down from that. Fine. But #3 cascades down from that, and since the bottom is now outside the bottom of the screen, the entire window gets moved up, completely ignoring where I moved it to in windowDidLoad, so it ends up being too high and under my palettes. I don't know why Apple doesn't have a method to get the preferred rect that it will respect when cascading, much like it knows how to get the visibleRect from the NSScreen and still respects that.

Ahhhh. Didn't consider the wrap around. Here:


- (NSRect)allowedRect;
{
	return NSMakeRect(100, 200, 1500, 650);
}


- (NSPoint)cascadeTopLeftFromPoint:(NSPoint)topLeft
{
	NSSize cascadeOffset = NSMakeSize(21, -23);


	// This window's top left
	if (NSEqualPoints(NSZeroPoint, topLeft)) {
		topLeft = NSMakePoint(NSMinX(self.allowedRect), NSMaxY(self.allowedRect));
	}

	CGFloat proposedRight  = topLeft.x + self.frame.size.width;
	CGFloat proposedBottom = topLeft.y - self.frame.size.height;

	if (proposedRight > NSMaxX(self.allowedRect)) {
		topLeft.x = NSMinY(self.allowedRect);
	}

	if (proposedBottom < NSMinY(self.allowedRect)) {
		topLeft.y = NSMaxY(self.allowedRect);
	}

	self.frameTopLeftPoint = topLeft;


	// Next window's top left
	return NSMakePoint(topLeft.x + cascadeOffset.width, topLeft.y + cascadeOffset.height);
}



If you never ever ever want a window to be able to be positioned under a palette (even if the user moves it there) then you additionally need to customize the constrain method. Something along the lines of:

- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen;
{
	// Move Right
	frameRect.origin.x = MAX(frameRect.origin.x, NSMinX(self.allowedRect));

	// Move Left
	frameRect.origin.x = MIN(frameRect.origin.x, NSMinX(self.allowedRect));

	// Move upward
	frameRect.origin.y = MAX(frameRect.origin.y, NSMinY(self.allowedRect));

	// Move downward
	frameRect.origin.y = MIN(frameRect.origin.y, NSMaxY(self.allowedRect) - frameRect.size.height);

	return [super constrainFrameRect:frameRect toScreen:screen];
}





--
Seth Willits

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

References: 
 >Setting the position of new windows (From: Steve Mills <email@hidden>)
 >Re: Setting the position of new windows (From: Kevin Perry <email@hidden>)
 >Re: Setting the position of new windows (From: Steve Mills <email@hidden>)
 >Re: Setting the position of new windows (From: Seth Willits <email@hidden>)
 >Re: Setting the position of new windows (From: Steve Mills <email@hidden>)

  • Prev by Date: Re: forward decls vs #import
  • Next by Date: Re: 'Pseudo' Singleton in Objective C
  • Previous by thread: Re: Setting the position of new windows
  • Next by thread: Re: Setting the position of new windows
  • Index(es):
    • Date
    • Thread