英语轻松读发新版了,欢迎下载、更新

小白学Mac之三:AutoLayout的痛

surefire 发布于 2015年09月28日
无人欣赏。

当我意识到NSSplitViewController默认只给了一个sub view时,我想给splitview添加另外一个缺失的sub view,但是在IB上实在没有找到方法,所以我决定通过代码来添加,这个确实不难,难的是,我没法像在IB上设置子控件、子视图们随着窗体变化而变化。

后来在一番搜索,我知道了addConstraint这个函数,真是个好东西。

三下五除二就上了,效果很好,固定子视图的大小分分钟的事情。但是问题来了,设置子视图全部占满父视图(就是.Net下设置dock模式为Fill)的效果时头大了——父视图被固定成子视图的大小了,无论怎样都动弹不得,好郁闷啊!水果家的API研究了无数次,还研究了坐标系,看到坐标系就想起来笛卡尔,想起笛卡尔就想起了爱因斯坦——尼玛,有这么复杂吗?研究完坐标系还是没解决问题,不过也是有点小收获——以前以为原点是屏幕左上角呢,原来水果家的是左下角,y坐标的问题倒是纠正了错误认识。

当一个问题解决不了的时候,我的办法就是绕过去——既然没法通过代码的方式设置约束进行自动布局,那我就在IB上做咯,繁琐就繁琐点咯。就这样,我推翻之前的设计,又在IB上开始一个NSSplitView套一个NSSplitView地开搞了,我也不知道套了多少个。虽然都是体力活,但要的效果也差不多了,不过心里总觉得有点不痛快——这个addConstraint函数肯定是能够实现我要的效果的,一定是我哪个地方没注意没设置。

在困扰了大约一个月的某个晚上,哄娃睡了之后打开电脑去美帝的网站闲逛了一圈,又不自觉地想起了AutoLayout这个令人不爽的问题——我承认我虽然不是专业码农,但是一个问题不解决或解决得不完美,我无法容忍它的存在。然后我也不知道自己输入了一个什么神奇的关键字,然后在某个stackoverflow的帖子上看到了这么一行代码:

view.translatesAutoresizingMaskIntoConstraints = false

然后幸福的生活就开始了。我也是觉得奇怪,在水果家的官方文档上,翻来翻去也就是介绍addConstraint本身怎么用,压根没提要先设置视图的这个属性为false(默认是true),而在IB上设置约束时XCode会自动给设置成false——尼玛,这黑科技,我一个小白怎么可能知道?

然后我那种兴奋溢于言表,不顾夜已深,连夜又把之前那一堆NSSplitView给拆了,从头再来,自己都要汗了。这一次也彻底搞清楚了addConstraint这个函数中两个视图的位置关系——之前的理解是有误的。后来的应用中,呵呵,对addConstraint是手到擒来啊,哈哈!

后来我就想,独自闭门造车真是费时间,要是有个有经验的人在边上随便提示一下,也不用困扰这么久了,这也是我总是有把我的小白过程写出来的一个冲动之一吧。不过,我想凡事都有两面性,虽然困扰我这么久,但在寻找答案的过程中,我的收获远不止知道addConstraint这个函数怎么用而已。

后来,我就开始想办法加载数据库的信息到一个棵树上——我觉得,appkit里应该有跟.Net下的Tree控件一样的东西,比如叫NSTreeView什么的,结果搜到了NSTreeController,钻研一番,发现没用,不是我想要的那个效果,于是又陷入了困惑中......

共4条回复
tinyfool 回复于 2015年09月29日

看过相关的文档么?

靠乱猜写程序是愚蠢的

pinxue 回复于 2015年09月29日

在 autolayout 前一代,用来实现弹性布局的方法是 autoresizing mask,现在仍然可以用……

坐标系,唔 iOS 的 UIKit 跟 Mac 的 AppKit 不一样,都 Apple 家的坐标系不一定一样哦。

你需要的是 NSOutlineView,NSTreeController 故名思意,是model controller,不是 view controller。另外,用 NSTableView 的缩进控制实现树形效果也不难的。

surefire 回复于 2015年09月29日

1楼 @tinyfool 我是边写边看,要用到时再去看文档

surefire 回复于 2015年09月29日

2楼 @pinxue 我对iOS也是一窍不通

登录 或者 注册