I'm using this: //http://www.cocoadev.com/index.pl?MagneticWindows - (void)windowDidMove:(NSNotification *)notification { NSEnumerator *e; NSWindow *theWindow; id edgeObject; NSArray *frames = [[[[NSApp windows] copy] autorelease] arrayByAddingObjectsFromArray:[NSScreen screens]]; //Edit 7 October 2004: this prefers window edges. change the above line to: //NSArray *frames = [[NSScreen screens] arrayByAddingObjectsFromArray:[NSApp windows]]; //to give snapping priority to screen edges. NSRect frame, myFrame; BOOL hDidChange = NO, vDidChange = NO; float gravity = 3; theWindow = [notification object]; myFrame = [theWindow frame]; e = [frames objectEnumerator]; if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask) return; while ((edgeObject = [e nextObject])) { if ( (edgeObject != theWindow && ([edgeObject respondsToSelector:@selector(isVisible)] && [edgeObject isVisible])) || [edgeObject isKindOfClass:[NSScreen class]] ) { // leave out the following if clause and just set frame to [edgeObject frame] //if you want windows to snap behind the dock if ([edgeObject isKindOfClass:[NSScreen class]]) { frame = [edgeObject visibleFrame]; } else { frame = [edgeObject frame]; } /* code continues here with */ /* horizontal magnet */ //NSLog(@"%f %f", NSMinX(frame) - NSMinX(myFrame), NSMinY(frame) - NSMinY(myFrame)); if (!hDidChange && fabs(NSMinX(frame) - NSMinX(myFrame)) <= gravity) { //NSLog(@"NSMinX(frame) - NSMinX(myFrame)"); myFrame.origin.x = frame.origin.x; hDidChange = YES; } if (!hDidChange && fabs(NSMinX(frame) - NSMaxX(myFrame)) <= gravity) { //NSLog(@"NSMinX(frame) - NSMaxX(myFrame)"); myFrame.origin.x += NSMinX(frame) - NSMaxX(myFrame); hDidChange = YES; } if (!hDidChange && fabs(NSMaxX(frame) - NSMinX(myFrame)) <= gravity) { //NSLog(@"NSMaxX(frame) - NSMinX(myFrame)"); myFrame.origin.x = NSMaxX(frame); hDidChange = YES; } if (!hDidChange && fabs(NSMaxX(frame) - NSMaxX(myFrame)) <= gravity) { //NSLog(@"NSMaxX(frame) - NSMaxX(myFrame)"); myFrame.origin.x += NSMaxX(frame) - NSMaxX(myFrame); hDidChange = YES; } /* vertical magnet */ if (!vDidChange && fabs(NSMinY(frame) - NSMinY(myFrame)) <= gravity) { //NSLog(@"NSMinY(frame) - NSMinY(myFrame)"); myFrame.origin.y = frame.origin.y; vDidChange = YES; } if (!vDidChange && fabs(NSMinY(frame) - NSMaxY(myFrame)) <= gravity) { //NSLog(@"NSMinY(frame) - NSMaxY(myFrame)"); myFrame.origin.y += NSMinY(frame) - NSMaxY(myFrame); vDidChange = YES; } if (!vDidChange && fabs(NSMaxY(frame) - NSMinY(myFrame)) <= gravity) { //NSLog(@"NSMaxY(frame) - NSMinY(myFrame)"); myFrame.origin.y = NSMaxY(frame); vDidChange = YES; } if (!vDidChange && fabs(NSMaxY(frame) - NSMaxY(myFrame)) <= gravity) { //NSLog(@"(NSMaxY(frame) - NSMaxY(myFrame)"); myFrame.origin.y += NSMaxY(frame) - NSMaxY(myFrame); vDidChange = YES; } } //if (v_isChanged && h_isChanged) break; } if ([[theWindow screen] isEqualTo:[NSScreen mainScreen]]) { if ((myFrame.size.height+myFrame.origin.y)>([[NSScreen mainScreen] frame].size.height-20)) { myFrame.origin.y = [[NSScreen mainScreen] frame].size.height-myFrame.size.height-20; } } NSDisableScreenUpdates(); [theWindow setFrame:myFrame display:NO]; NSEnableScreenUpdates(); }
On Mar 12, 2013, at 9:54 PM, Steve Mills <smi...@makemusic.com> wrote: > On Mar 12, 2013, at 15:29:53, Seth Willits <sli...@araelium.com> wrote: > >> Pretty sure you want to subclass and override constrainFrameRect:toScreen: >> but I can't recall off the top of my head whether this is called live for >> every movement. I believe it is. > > Nope. It only seems to be called when the window is being created and *after* > the mouse has been released during a move. > > -- > Steve Mills > office: 952-818-3871 > home: 952-401-6255 > cell: 612-803-6157 > > > > _______________________________________________ > > Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) > > 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: > https://lists.apple.com/mailman/options/cocoa-dev/tamas.lov.nagy%40gmail.com > > This email sent to tamas.lov.n...@gmail.com _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com