Mac开发云集Mac开发MacOS开发 技术集锦

Mac OS X开发之NSButton

2016-09-19  本文已影响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

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

上一篇下一篇

猜你喜欢

热点阅读