• 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: Round corners of borderless NSWindow without set it transparent
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Round corners of borderless NSWindow without set it transparent


  • Subject: Re: Round corners of borderless NSWindow without set it transparent
  • From: Seth Willits <email@hidden>
  • Date: Mon, 27 Feb 2012 21:36:13 -0800

On Feb 27, 2012, at 5:45 AM, Andrea3000 wrote:

> Then, if I set my NSWindow non-opaque I correctly get rounded corners but the window becomes very slow expecially during resize.

Mmm…. that doesn't sound right. You shouldn't notice anything being slow.



> Therefore I'm looking for a way to mimic QuickTime X window which is (or seems at least) a borderless window and still has rounded corners.

QuickTime Player uses a custom NSFrameView. It's not a typical borderless window, it does private internal stuff to draw the titlebar as it pleases.



> I've found some tutorials online that subclass NSThemeFrame in order to draw the content view with rounded corners and then use the method of NSWindow: -setBottomCornerRounded:YES.
> Unfortunately this solution works only on a regular NSWindow.

And uses private APIs so it wouldn't work for MAS and is generally a no no.





So I posited a theory and it seems to hold true.

This is a standard titled window, with a custom-drawn title bar using a custom view I simply added to the window:
http://sethwillits.com/temp/upshot/upshot_o0V3gSE1.jpg


This is *not* production code, but it proves a point. If you tweaked the standard window buttons to have a different look (which I belieeeeve is possible), then you could get closer to the QT look (which has dark shadows under the buttons, not light ones).



{
	NSRect bounds = [[[_window contentView] superview] bounds];
	BlackTitlebarView * view = [[BlackTitlebarView alloc] initWithFrame:bounds];
	[view setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
	[[[_window contentView] superview] addSubview:view positioned:NSWindowBelow relativeTo:[[[[_window contentView] superview] subviews] objectAtIndex:0]];
}



@implementation BlackTitlebarView

- (void)drawRect:(NSRect)dirtyRect
{
	NSRect windowFrame   = [NSWindow frameRectForContentRect:[[[self window] contentView] bounds] styleMask:[[self window] styleMask]];
	NSRect contentBounds = [[[self window] contentView] bounds];

	NSRect titlebarRect = NSMakeRect(0, 0, self.bounds.size.width, windowFrame.size.height - contentBounds.size.height);
	titlebarRect.origin.y = self.bounds.size.height - titlebarRect.size.height;

	NSRect topHalf, bottomHalf;
	NSDivideRect(titlebarRect, &topHalf, &bottomHalf, floor(titlebarRect.size.height / 2.0), NSMaxYEdge);

	NSBezierPath * path = [NSBezierPath bezierPathWithRoundedRect:self.bounds xRadius:4.0 yRadius:4.0];
	[[NSBezierPath bezierPathWithRect:titlebarRect] addClip];


	NSGradient * gradient = [[[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.51 alpha:1.0]
														   endingColor:[NSColor colorWithCalibratedWhite:0.21 alpha:1.0]] autorelease];


	[path addClip];

	[[NSColor colorWithCalibratedWhite:0.13 alpha:1.0] set];
	[path fill];
	[gradient drawInRect:topHalf angle:270.0];

	[NSGraphicsContext saveGraphicsState];
		NSAffineTransform * xfm = [NSAffineTransform transform];
		[xfm translateXBy:0.0 yBy:-1.0];
		[xfm concat];
		[[NSColor colorWithCalibratedWhite:1.0 alpha:0.5] set];
		[path setLineWidth:1.0];
		[path stroke];
	[NSGraphicsContext restoreGraphicsState];

	[[NSColor blackColor] set];
	[path setLineWidth:1.5];
	[path stroke];

	[[NSColor blackColor] set];
	NSRectFill(NSMakeRect(0, 0, self.bounds.size.width, 1.0));
}

@end




--
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


  • Follow-Ups:
    • Re: Round corners of borderless NSWindow without set it transparent
      • From: Andrea3000 <email@hidden>
References: 
 >Round corners of borderless NSWindow without set it transparent (From: Andrea3000 <email@hidden>)

  • Prev by Date: Re: How to support larger NSView hierarchy?
  • Next by Date: Re: How to support larger NSView hierarchy?
  • Previous by thread: Round corners of borderless NSWindow without set it transparent
  • Next by thread: Re: Round corners of borderless NSWindow without set it transparent
  • Index(es):
    • Date
    • Thread