Mac OS X开发之NSButton

作者: 於一念 | 来源:发表于2016-09-19 11:22 被阅读2280次

          公司项目需求,转了Mac开发,今天是实际上手代码的第二天,总结一下昨天的问题,大部分是出在NSButton上面,现在对于NSButton依然不是很了解,只是把昨天解决的bug拿出来跟大家分享一下,以后对于NSButton的理解深入了,再过来补充........

    Bug一、更改NSButton的高度

    图一,button的frame属性Height被系统锁死,无法更改

          如图所示,interfaceBuilder中拖入一个button以后,button的frame属性Height被系统锁死,无法更改。期初碰到这个bug真是感觉不可思议啊,尝试变了属性面板的绝大部分属性,都没能把高度解锁,最后无奈之下,只好看xib文件的源码,进行分析。

         解决方案一(推荐方案二)、

          首先找到button控件的id(参考图二),然后在xib文件源码中搜索(参考图三),

    图二:button的ID再属性面板中的位置 图三:button在xib中的源码

          在图三中可以直接修改button的rect属性,把height直接给修改成你想要的高度值,本人期初是这么做的,但是既然是不起作用,程序编译一次以后height的属性值就又被系统给修改成默认值32,要崩溃了有木有啊......!!!

          没办法,认真理下思路,再看看是不是源码中有什么开关控制,找来找去只有translatesAutoresizingMaskIntoConstraints这个属性最沾边,反正是个布尔值,改下试试又不花钱,改成YES后,完美成功改变了button的高度,黄天不负有心人,终于改掉了button的高度了......

    解决方案二(推荐)、

          可是仔细思考下,苹果应该不至于出如此难交互的开发控件吧,反正项目还不是很急,就再到处找找,多尝试下。

          经过多次尝试,终于在一个阴暗的角落发现了button的高度修改方法,请看图:

    图四:button的style属性

           对,你没看错,就是button的style属性,前面也说过了,尝试了button的绝大部分属性都不成功,但就是把style属性给忽略了,原因就是当时尝试了Check和Radio属性后,直接修改了button的样式,所以以为这个是用来修改button的样式的,可结果谁曾料想,Square样式就可以让button的高度属性解锁呢???汗颜啊..............

           Bug一、更改NSButton的背景色

          同样找遍button的所有属性都没有找到能够修改button背景色的属性,无奈之下去看头文件,搜索遍button及父类的所有头文件也找不到背景色的属性。纳尼???button难道没有背景色吗?没办法,无奈之下,去github上面找找资料看看,下了一份MXButton来看看,根据作者的描述是可以修改Button的背景色的。拿到代码之后看到,作者是把ButtonCell中的backgroundColor属性封装到了Button一层,以便修改。哦哦,搜打死内,原来Button的背景色属性在ButtonCell里面啊,再去interfaceBuilder的属性面板中看一眼吧,好吧,我确认我查看的是ButtonCell的属性,可以依然找不到backgroundColor属性,好吧......我无奈了,苹果,你够可以的,我服,大写的服!!!

          既然MXButton可以解决这个问题,那就用MXButton吧,毕竟还有点特色功能,虽然不怎么起眼.......纳尼?怎么又失败了,欲哭无泪啊.........

          总结:MXButton不可以修改NSButton的背景色!!!

          既然此路不通,咱就再想其他的法,使用KVC直接修改NSButton的背景色,通过打印日志可以看到,backgroundColor属性确实被修改掉了,但是NSButton的背景色依然没有修改成功,看来,苹果更新的时候,backgroundColor属性已经被弃用了啊.......

          没办法,又一路不通,咱再想其它法,这才是程序员精神!!!

          通过Google发现,stackoverflow上面对于修改NSbutton背景色的回答,清一色都是:苹果不推荐如此做,或者不建议这么做。偶然翻到一个说是重写drawRect方法的,如获至宝啊.......重写,走起.......

    ```

    @interfaceYHNButton :NSButton

    @property(nonatomic,strong)NSColor*backgroundColor;

    @property(nonatomic,strong)NSColor*titleColor;

    @end

    - (void)drawRect:(NSRect)dirtyRect

    {

    ;

    [superdrawRect:dirtyRect];

    if(self.backgroundColor!=nil) {

    [self.backgroundColorset];

    NSRectFill(self.bounds);

    }

    //绘制文字

    if(self.title!=nil) {

    NSColor*color =self.titleColor?self.titleColor: [NSColorblackColor];

    NSMutableParagraphStyle*paraStyle = [[NSMutableParagraphStylealloc]init];

    [paraStylesetParagraphStyle:[NSParagraphStyledefaultParagraphStyle]];

    [paraStylesetAlignment:NSCenterTextAlignment];

    //[paraStyle setLineBreakMode:NSLineBreakByTruncatingTail];

    NSDictionary*attrButton = [NSDictionarydictionaryWithObjectsAndKeys:[NSFontfontWithName:@"Verdana"size:14],NSFontAttributeName, color,NSForegroundColorAttributeName, paraStyle,NSParagraphStyleAttributeName,nil];

    NSAttributedString* btnString = [[NSAttributedStringalloc]initWithString:self.titleattributes:attrButton];

    [btnStringdrawInRect:NSMakeRect(0,4,self.frame.size.width,self.frame.size.height)];

    }

    }

    ```

    后续需要补充的知识点:

    一、NSButton和NSButtonCell的关系.....这个暂时先放后边去慢慢了解吧

    早上留的坑,中午没啥事,就去查了一下苹果的官方文档,所以过来补充下,先上图....

    图五:NSCell 图六:NSButtonCell 图七:NSButton 图八:backgroundColor

    如果又看到这段的大神,也可以留言帮我解疑,谢过.....

    相关文章

      网友评论

      • ShevaKuilin:请教一下,我的NSButton的Type设置成了momentary change,image和alternateImage也设置了,但是为什么点击只有短暂的图片更换,如何点一下直接切换状态呢
      • 伊织随意写:修改背景色,不是这样就好了吗?

        btn.wantsLayer = YES;
        btn.layer.backgroundColor = [NSColor cyanColor].CGColor;
      • 浅夏旧时光:其实你可以设置图片的,嗯
      • A_rcher34:您好,请问有没有办法修改nsbutton的image的位置
        於一念: @A_rcher34 重写drawrect方法
      • lemon007:这样重写了的话,就得用这个YHNButton,然后用代码创建对吧?xib的话,有没有办法实现?
        beauty_rabbit:@於一念 还有什么方法,我现在正步履着你的坑
        於一念:方法多的很,上面列举的只是我刚开始摸索Mac时的做法,后来做得多了,发现,实现起来方法多了去了........

      本文标题:Mac OS X开发之NSButton

      本文链接:https://www.haomeiwen.com/subject/ssogettx.html