关闭/最小化/全屏居中处理(仿Mac QQ),效果如下
在WindowController
中添加以下代码,直接复制到控制器并修改控制器名称就可以了。
@interface FSWindowCtl ()<NSWindowDelegate> @end
@implementation FSWindowCtl
- (void)windowDidLoad { [super windowDidLoad]; [self settingWindowStyle]; }
- (void)settingWindowStyle { self.window.titlebarAppearsTransparent = YES; self.window.titleVisibility = NSWindowTitleHidden; self.window.styleMask = NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskTitled | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskFullSizeContentView; [self.window setMovableByWindowBackground:YES]; [self updateTitleBarOfWindow:NO]; }
- (void)updateTitleBarOfWindow:(BOOL)fullScreen { CGFloat kTitlebarH = 54.0; CGFloat kFullScreenButtonYOrigin = 3.0; NSRect windowFrame = self.window.frame; NSView *titlebarContainerView = [self.window standardWindowButton:NSWindowCloseButton].superview.superview; NSRect titlebarContainerFrame = titlebarContainerView.frame; titlebarContainerFrame.origin.y = windowFrame.size.height - kTitlebarH; titlebarContainerFrame.size.height = (CGFloat)kTitlebarH; titlebarContainerView.frame = titlebarContainerFrame; CGFloat buttonX = 12.0; NSButton *closeBtn = [self.window standardWindowButton:NSWindowCloseButton]; NSButton *minimizeBtn = [self.window standardWindowButton:NSWindowMiniaturizeButton]; NSButton *zoomBtn = [self.window standardWindowButton:NSWindowZoomButton]; for (NSButton *buttonView in @[closeBtn, minimizeBtn, zoomBtn]) { NSRect buttonFrame = buttonView.frame; buttonFrame.origin.y = fullScreen ? kFullScreenButtonYOrigin : round((kTitlebarH - buttonFrame.size.height)/2.0); buttonFrame.origin.x = (CGFloat)buttonX; buttonX = buttonFrame.size.width + buttonX + 6; [buttonView setFrameOrigin:buttonFrame.origin]; } }
#pragma mark - NSWindowDelegate - (void)windowDidEnterFullScreen:(NSNotification *)notification { [self updateTitleBarOfWindow:YES]; }
- (void)windowDidExitFullScreen:(NSNotification *)notification { [self updateTitleBarOfWindow:NO]; }
- (void)windowDidResize:(NSNotification *)notification { [self updateTitleBarOfWindow:NO]; }
@end
|