公司项目需求,转了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如果又看到这段的大神,也可以留言帮我解疑,谢过.....
网友评论
btn.wantsLayer = YES;
btn.layer.backgroundColor = [NSColor cyanColor].CGColor;