OSX10.11分屏(SplitView)功能的新特性研究(一)

14 篇文章 0 订阅
14 篇文章 2 订阅
OSX10.11分屏(SplitView)功能的新特性研究(一)

        OSX10.11增加了分屏功能的新特性,这种新特性苹果并没有向开发者提供相应的公开api。使用NSWindow原生态TitleBar的app,相应的Window都会具有此功能。长按最大化按钮,就可以触发分屏功能(SplitView)。

        大多数情况下,我们都会自定义TilteBar,因为原生态的TilteBar样式没法修改。在这种情况下,要想使用分屏功能,只能使用原生态的按钮。

NSButton *zoombutton = [NSWindow standardWindowButton:NSWindowZoomButton forStyleMask:window.styleMask
并且必须设置window的属性为 NSWindowCollectionBehaviorFullScreenPrimary 才可以显示全屏的按钮,否则只能是zoom的属性。按照上述的操作,运行app,长按全屏按钮确实会触发分屏的功能。         分屏功能到底触发了哪个函数呢,带着这个疑问,让我们继续往下研究。 在zoombutton处打个断点,运行app,截图如下:

发现_NSThemeZoomWidget类的button和_NSThemeZoomWidgetCell类的cell,这些都是私有的类。
        至此我们需要想办法查看私有类的定义,网上可以搜到一个开源的class-dump小工具http://stevenygard.com/projects/class-dump/。这个小工具可以满足我的需求,我们使用来提取Appkit.frame中私有的类定义。
        小工具安装:
        1. 下载class-dump,http://stevenygard.com/projects/class-dump/
        2. 将class-dump放在usr/local/bin目录中。
        3. 修改class-dump的执行权限:
切换到usr/local/bin目录下,输入命令 chmod 777 class-dump
        4. 在命令行中使用class-dump。

        安装完成后,控制台输入如下命令:
class-dump -H /System/Library/Frameworks/AppKit.framework/AppKit -o your output path
其中 -H 后面表示要导出的框架,-o 后面紧跟着.h文件输出的路径。最后可以看到导出了一大堆的头文件:

        在众多的文件中,找到_NSThemeZoomWidget.h 和 _NSThemeZoomWidgetCell.h文件,仔细研究,发现_NSThemeZoomWidgetCell.h文件中的 _performedHandoff和
_eligibleForHandoff比较的可疑。其中_NSThemeZoomWidgetCell.h文件如下:

//
//     Generated by class-dump 3.5 (64 bit).
//
//     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard.
//

#import <AppKit/_NSThemeWidgetCell.h>

__attribute__((visibility("hidden")))
@interface _NSThemeZoomWidgetCell : _NSThemeWidgetCell
{
    BOOL _performedHandoff;
    BOOL _stoppedTracking;
    BOOL _eligibleForHandoff;
    struct CGPoint _mouseLocation;
}

- (BOOL)_sendActionFrom:(id)arg1;
- (void)stopTracking:(struct CGPoint)arg1 at:(struct CGPoint)arg2 inView:(id)arg3 mouseIsUp:(BOOL)arg4;
- (BOOL)continueTracking:(struct CGPoint)arg1 at:(struct CGPoint)arg2 inView:(id)arg3;
- (BOOL)startTrackingAt:(struct CGPoint)arg1 inView:(id)arg2;
- (BOOL)trackMouse:(id)arg1 inRect:(struct CGRect)arg2 ofView:(id)arg3 untilMouseUp:(BOOL)arg4;
- (void)performHandoff:(id)arg1;
- (void)performClick:(id)arg1;
- (void)setHighlighted:(BOOL)arg1;
- (BOOL)_hitTestForTrackMouseEvent:(id)arg1 inRect:(struct CGRect)arg2 ofView:(id)arg3;
而这个触发分屏功能的极有可能是performHandoff:(id)arg1函数,下面就验证一下。 点击下面图片中的”+”号位置

        点击Add symbolic BreakPoint,填写如下信息。

        最后填写完成时,工程如下:

        运行app,长按最大化按钮,我们惊奇的发现触发了断点

        上述只是阐述了一种追根溯源的思维方法吧,希望对大家以后的开发以及调试起到抛砖引玉的作用。
        转载请注明出处:http://blog.csdn.net/skynullcode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值