第三节,第一课NSButton使用,macOS开发入门之实战课程(仿主流视频app界面)

第三节,第一课NSButton使用,macOS开发入门之实战课程(仿主流视频app界面)

如果你开发过iOS,经过前面二节你肯定已经入门了,对于一些基础控件的使用我们可以直接使用option键跳转官方文档查看。从这节课开始,我们直接进入UI实战课程。效果如下图:


我将首页分为二个部分,一个部分是左边的分类栏,右边是分类内容展示页面。

为方便管理我们分别新建二个NSViewController:

在ViewController.m代码:

- (void)viewDidLoad {

[super viewDidLoad];

  [self addSplitView];

}

#pragma mark- view methods

- (void)addSplitView {


  CGFloat leftViewWidth = CGRectGetWidth(self.view.frame)/7;

  CGFloat rightViewWidth = CGRectGetWidth(self.view.frame)-leftViewWidth;

  CGFloat viewHeight = CGRectGetHeight(self.view.frame);


  XLMenuLeftVC *leftVC = [XLMenuLeftVC new];

  [self addChildViewController:leftVC];

  leftVC.view.frame = CGRectMake(0, 0, leftViewWidth, viewHeight);

  leftVC.view.wantsLayer = YES;

  leftVC.view.layer.backgroundColor = [NSColor clearColor].CGColor;

  [self.view addSubview:leftVC.view];

  XLRightContentVC *rightVC = [XLRightContentVC new];

  [self addChildViewController:rightVC];

  rightVC.view.frame = CGRectMake(leftViewWidth, 0, rightViewWidth, viewHeight);

  rightVC.view.wantsLayer = YES;

  rightVC.view.layer.backgroundColor = [UIUtils colorWithHexColorString:@"0x3A3C40"].CGColor;

  [self.view addSubview:rightVC.view];

}

在这里为方便后面扩展,我们新建一个基础NSViewController。

前面说到macOS开发遵循严格的mvc架构,所以,我们在定义baseViewController的时候直接

新建一个NSView,后面就不用每次都新建NSView了,代码如下:

新建一个@interface XLBaseViewController : NSViewController

在XLBaseViewController.m中实现:

- (void)loadView{

  NSView *view = [[NSView alloc]initWithFrame:CGRectMake(0, 0, 0,0)];

  self.view = view;

}

前面的XLMenuLeftVC和 XLRightContentVC分别继承与XLBaseViewController。

@interface XLMenuLeftVC : XLBaseViewController;

@interface XLRightContentVC : XLBaseViewController;

现在我们来看下现在工程目录:


我们现在在XLMenuLeftVC.m文件实现TabBar的功能。

第一步我们先学习NSButton的使用:

声明一个button:

@interface XLMenuLeftVC ()

@property (nonatomic, strong)NSButton  *playButton;

@end

进行简单初始化:

#pragma mark- init methods

- (NSButton *)playButton{

  if (!_playButton) {

    NSButton *playButton = [NSButton buttonWithTitle:@"Play" target:self action:@selector(playButtonClicked:)];

    _playButton = playButton;

  }

  return _playButton;

}

设置frame:

- (void)viewDidAppear{

  CGRect gRect = CGRectMake(0, CGRectGetHeight(self.view.frame)-40-10, CGRectGetWidth(self.view.frame), 40);

  self.playButton.frame = gRect;

}

- (void)playButtonClicked:(NSButton *)sender{

  NSLog(@"playButtonClicked");

}

这个有个知识点:

macOS中view的属性:@property NSRect frame;它的坐标原点在左下方。

CGRect的frame是在左上方。

运行然后点击play会打印信息:

2021-03-07 12:55:59.449610+0800 demo02[7131:518158] playButtonClicked

这样NSButton的初步使用就OK了

现在我们来看下NSButton的其他设置:

//按钮样式

    _playButton.bezelStyle = NSBezelStyleRegularSquare;

    //是否显示背景 默认YES

    _playButton.bordered = YES;

    //按钮的Type

    [_playButton setButtonType:NSButtonTypeMomentaryPushIn];

    //设置图片

    _playButton.image = [NSImage imageNamed:@"close.png"];

    //按钮的标题

    [_playButton setTitle:@"Play"];

    //是否隐藏

    _playButton.hidden = NO;

    //标题居中显示

    _playButton.alignment = NSTextAlignmentCenter;

    //设置背景是否透明

    _playButton.transparent = NO;

    //按钮初始状态

    _playButton.state = NSControlStateValueOff;

    //按钮是否高亮

    _playButton.highlighted = NO;

    //设置title大小

    _playButton.font = [NSFont systemFontOfSize:20];

    /*

    富文本文字

    NSMutableAttributedString *nameAttribute = [[NSMutableAttributedString alloc] initWithString:@"播放:视频"];


    NSRange range = NSMakeRange(0, 3);


    [nameAttribute addAttribute:NSForegroundColorAttributeName

          value:[NSColor redColor]

          range:range];


    [nameAttribute addAttribute:NSFontAttributeName

              value:[NSFont systemFontOfSize:14]

              range:range];


    [nameAttribute fixAttributesInRange:range];

    */

留下一个问题:

按钮的width与父组件的width是一样的,但是实际显示却不是的,这是为什么呢?

(lldb) po gRect

(origin = (x = 0, y = 670), size = (width = 163.57142857142858, height = 40))

(lldb) po self.view.frame

(origin = (x = 0, y = 0), size = (width = 163.57142857142858, height = 720))


下节课我们将学习点击按钮跳转新的窗口。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容