NSView subview blocking drag/drop event
2024-09-06 16:01:51
近期在Mac项目中有一个处理鼠标拖拽事件的需求, 大致处理流程是这样的:
- 从 NSView 继承得到一个子类
- 覆盖处理拖拽事件相关方法
- 注册拖拽事件
开始的时候一切都很正常,直到某次发现拖拽到屏幕边缘响应较为灵敏,而拖拽到屏幕中间则不响应事件,APP页面大致是这样的:
问题分析
开始我一直以为是系统事件不太灵光, 后来发现只有在拖动到屏幕中间时候出现这个问题, 这个现象十分奇怪, 后来联想到页面中间有一张图片,猜测是否是因为图片截获了拖拽事件。
那么如何验证呢?其实也很简单,在自定义的NSView 中重载draggingEnded:
方法,同时添加 log,发现鼠标拖拽到页面中间时, 该方法就不再被调用。因此可以得出结论,在自定义的 NSView
中添加的NSImageView
作为 subview 会阻止拖拽事件的传递,原因是NSImageView
本身可以处理拖拽事件,于是截获了本该自定义NSView
处理的消息。
解决方案
在网上搜索了一下这个问题,发现已经有人给出了解决方案,具体链接:http://stackoverflow.com/questions/5892464/cocoa-nsview-subview-blocking-drag-drop
提供的解决方案有以下几种:
- 不使用
NSImageView
,而是采用自定义NSView
的方式,然后重写drawRect:
方法进行图片渲染。这个办法十分笨拙,并且不太方便。 - 调用
unregisterDraggedTypes
方法,这样NSImageView
就不会监听拖拽事件了,完美解决。
参考文档
- http://stackoverflow.com/questions/5892464/cocoa-nsview-subview-blocking-drag-drop
- http://stackoverflow.com/questions/4782636/nsview-subviews-interrupting-drag-operation
最新文章
- PDO概念 分析 练习
- iOS8新特性(1)-UIPopoverPresentationController使用
- java并发编程(十四)同步问题的内存可见性
- jQuery常用方法和函数
- python3 文件增删查
- 转义字符(\)对JavaScript中JSON.parse的影响概述
- WinForm------点击Control弹出MessageBox
- navicat 链接linux 服务器上的数据库
- linux命令学习-su
- NOJ 1651 Red packet(二分)
- Executing modules as scripts
- Check the quota usage
- AS3排序
- HDU 2451 Simple Addition Expression(组合数学)
- 201521123060 《Java程序设计》第6周学习总结
- 人工智能-调百度AI接口+图灵机器人
- Linux命令——head/tail
- C#中datagridview选中行后textbox显示选中的内容
- .Net生成导出Excel
- 160426、JavaScript 秘密花园
热门文章
- Kubernetes实战之部署ELK Stack收集平台日志
- 7.2.*PHP编译安装时常见错误解决办法,php编译常见错误
- UITextFIeld的输入格式问题 ----W.P
- array_intersect_key 取得需要字段 用法
- gitlab登录时出现402的错误
- if循环&;数据类型的内置方法(上)
- Solution -「HDU 6643」Ridiculous Netizens
- mysql data local的使用导入与导出数据到.txt
- Java并发基础之Compare And Swap/Set(CAS)
- Spring Boot数据访问之动态数据源切换之使用注解式AOP优化