OSX下原生态按钮的Hover状态

来源:互联网 发布:上古卷轴5精灵捏脸数据 编辑:程序博客网 时间:2024/06/05 16:58
OSX原生态按钮的Hover状态

        在上一篇《OSX10.11分屏(SplitView)功能的新特性研究》文章中,介绍了自定义TitleBar时,用到了原生态的按钮。此时的原生态按钮的行为跟使用原生态的TitleBar上自带的按钮行为还有点不一样,你把鼠标移到最大化、最小话以及关闭按钮上的时候,会发现没有hover的状态。

        究竟是什么原因呢?我们该如何解决这个问题呢?带着疑问,查看NSButton的定义,里面提供的各种函数尝试一遍都不起多用,此时我们就应该想到了私有类的私有函数,这三个原生态按钮的cell都继承于_NSThemeWidgetCell类,查看这个类,最终锁定了coreUIState这个方法,并且进一步追踪出三种状态下返回字符串为”normal”(正常态)、”rollover”(悬停态)以及”pressed”(按下态)。有关如何锁定的问题,请参看上篇文章,留给开发者自己实践去了。

        最后使用Method Swizzling 钩住(Hook)我们想截获的消息,并对感兴趣的消息进一步的处理,代码片段如下:

//设置标示,便于从截获的消息中,找出我们感兴趣的对象 [self.closeButton setTitle:@"OSX_CUSTOM_BUTTON"]; [self.minimizeButton setTitle:@"OSX_CUSTOM_BUTTON"]; [self.zoomButton setTitle:@"OSX_CUSTOM_BUTTON"];//消息劫持代码CFStringRef (* originalIMP)(id self, SEL _cmd);//保存原始的消息函数Method coreUIWidgetStateMethod=class_getInstanceMethod(NSClassFromString(@"_NSThemeWidgetCell"), NSSelectorFromString(@"coreUIState"));const char *encoding=method_getTypeEncoding(coreUIWidgetStateMethod);originalIMP=(void*)method_getImplementation(coreUIWidgetStateMethod);class_replaceMethod(NSClassFromString(@"_NSThemeWidgetCell"), NSSelectorFromString(@"coreUIState"), (IMP)methodState, encoding);//处理劫持的消息static CFStringRef methodState(id self, SEL _cmd) {    if ([self isKindOfClass:[NSButtonCell class]]) {        NSButtonCell *cell = (NSButtonCell*)self;        NSString *title = [cell title];        if ([title isEqualToString:@"OSX_CUSTOM_BUTTON"]) {            if (cell.highlighted) {                return (__bridge CFStringRef)@"pressed";            } else if (cell.state) {                return (__bridge CFStringRef)@"rollover";            } else {                return (__bridge CFStringRef)@"normal";            }        }    }    //不是我们感兴趣的,调用原来的消息处理函数    return originalIMP(self,_cmd);}//鼠标移入与移除事件,切换正常态与悬停态-(void)mouseEntered:(NSEvent *)theEvent {    [self setTitleButtonDisplay:YES];}-(void)mouseExited:(NSEvent *)theEvent {   [self setTitleButtonDisplay:NO];}- (void)setTitleButtonDisplay:(BOOL)bHover {//设置state属性值代表按钮正常与悬停的状态    [closeButton setState:bHover];    [zoomButton setState:bHover];    [minimizeButton setState:bHover];    [closeButton setNeedsDisplay:YES];    [zoomButton setNeedsDisplay:YES];    [minimizeButton setNeedsDisplay:YES];}

        将上述代码移植到自己的工程中,会发现神奇的事情发生了,按钮可以捕捉到hover状态了。

        转载请注明出处:http://blog.csdn.net/skynullcode

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信版本低无法登录无法升级怎么办 手机淘宝五应用界面无法打开怎么办 入住淘宝主播没有微博粉丝怎么办 手机淘宝领金币怎么没有了怎么办 淘宝荬家缺货对付款买家怎么办 淘宝买家确认收货后申请退款怎么办 淘宝东西失效了但付过款了怎么办 淘宝图片被投诉盗图怎么办原图没了 淘宝退款申请不小心撤销了怎么办 淘宝不小心点了撤销退款怎么办 淘宝上退款不小心撤销了怎么办 新店淘宝卖家想开通直播怎么办 想开通淘宝直播却没有粉丝怎么办 淘宝店家拒绝给我改地址怎么办0 淘宝被投诉卖假申诉失败怎么办 要退保证金但是有人买东西了怎么办 手机淘宝上我是商家停止服务怎么办 淘宝上买的电脑商家关闭了怎么办 淘宝链接复制链链接发不出去怎么办 淘宝卖家填错地址货已经发了怎么办 拼多多没交保证金无法提现怎么办 信用卡被别人刷了没证据怎么办 我在淘宝开个店卖衣服没人买怎么办 收货地址填错了卖家已发货怎么办 淘宝店上的供货商不发货怎么办 在淘宝买的花退到卖家后死了怎么办 在淘宝买东西付款开通了花呗怎么办 淘宝网投诉卖家也不处理问题怎么办 淘宝图片空间上传不了大图片怎么办 不小心把设置里打印机删掉了怎么办 电脑上qq不小心删掉了怎么办 进了一批款式不好卖的衣服怎么办? 淘宝首页图片不居中代码装的怎么办 小语言代码装修以后不是全屏怎么办 招教年龄超过4个月怎么办 淘宝上注册的店铺被别人用了怎么办 淘宝贷款后店铺转让了贷款怎么办 手机千牛发布宝贝类目找不到怎么办 亚马逊被移除销售权该怎么办 玉米煮水不够熟吃了怎么办 华为云手机找回关了找回手机怎么办