MacOS 開發(fā)(二):NSViewController 純代碼實現(xiàn)

因為系統(tǒng)機制導致,MainViewController必須自己實現(xiàn) loadView:

方法一:每個 NSViewController 類手動添加 loadView 方法如下:

class MainViewController: NSViewController {
    
    override func loadView() {
        // 設置 ViewController 大小同 mainWindow
        guard let windowRect = NSApplication.shared.mainWindow?.frame else { return }
        view = NSView(frame: windowRect)
        view.wantsLayer = true
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.

    }
    
}

方法二:通過Swizzing 動態(tài)添加

//
//  NSViewController+Hook.m
//  MacTemplet
//
//  Created by Bin Shang on 2019/6/10.
//  Copyright ? 2019 Bin Shang. All rights reserved.
//

#import "NSViewController+Hook.h"
#import "NSObject+Hook.h"
#import "NNView.h"

@implementation NSViewController (Hook)

+ (void)initialize{
    if (self == self.class) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            [self swizzleMethodInstance:self.class origSel:@selector(loadView) replSel:@selector(hook_loadView)];
        });
    }
}

- (void)hook_loadView{
    NSWindow *window = NSApplication.sharedApplication.mainWindow;
    self.view = [[NNView alloc]initWithFrame:window.frame];
}

@end

NNView:macOS坐標系是左下角為(0, 0)點,與 iOS 不同,可以通過重寫- (BOOL)isFlipped;方法解決(iOS開發(fā)者表示很開心??)

//
//  NNView.m
//  MacTemplet
//
//  Created by Bin Shang on 2019/6/8.
//  Copyright ? 2019 Bin Shang. All rights reserved.
//

#import "NNView.h"

@implementation NNView

- (BOOL)isFlipped{
    return YES;
}

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
    
    // Drawing code here.
}

#pragma mark- set get

-(void)setBackgroundColor:(NSColor *)backgroundColor{
    _backgroundColor = backgroundColor;
    self.layer.backgroundColor = backgroundColor.CGColor;
}

@end
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容