手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b

不知为何 我在 OS X 10.11.5 及 Xcode 7.3 的 Storyboard 中设置 Tab View Controller 的 Transition 属性时,Tab View Controller 并不能自动根据子 View Controller 的 Preferred Content Size 来动画渐变,因此只能自己实现了(包括 Propagate Title)。

目前的 Storyboard 设置: 
记得关掉 Propagate Title,因为在我的 build 上没有任何用处,而且还影响后面通过 Delegate 手动设置标题。 

Step 1: 
Subclass TabView Controller,这里是JZSettingsTabViewController,加上 NSTabViewDelegate

Step 2: 
实现协议,

- (void)updateWindowSizeWithItem:(NSTabViewItem *)item
{
    NSWindow *window = self.view.window;
    NSSize contentSize = item.viewController.preferredMinimumSize;
    NSSize newWindowSize = [window frameRectForContentRect:(CGRect){CGPointZero, contentSize}].size;

    NSRect frame = [window frame];
    frame.origin.y += frame.size.height;
    frame.origin.y -= newWindowSize.height;
    frame.size = newWindowSize;
    [self.view.window setFrame:frame display:YES animate:YES];
    window.title = item.label;
}

Step 3: 
既然上面是通过 preferredMinimumSize 获取的 Size,那么在子 View Controller 的实现文件里加上这句,这个时候就不要写 Preferred Content Size 了:

- (CGSize)preferredMinimumSize
{
    return CGSizeMake(500, 400);
}

虽然这样 Size 就不是通过 Storyboard 设置了略嫌麻烦,不过考虑到 TabView Controller 的每个子 VC 都肯定要实现的,也还算可以。 
我这里是因为要写 设置界面 所以用到了 NSTabViewController 并且保持固定的 Window 大小(通过去除 NSResizableWindowMask),如果需要一个可以 Resize 的 Window 同时保持不同 Tab 的大小切换动画,

NSSize contentSize = item.viewController.preferredMinimumSize;

这句可以适当修改,比如修改为当前拉伸后的预期大小。

时间: 2024-10-08 22:08:18

手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b的相关文章

css3 transform transition animation 练习

旋转 位移 缩放 扭曲 动画 <!DOCTYPE HTML><html> <head> <meta charset="utf-8" /> <title>css3 transform transition animation 练习</title> <style type="text/css"> body { padding: 10px 50px; } div { margin: 50p

css3 transition animation nick

时光转眼即逝,又到周六了,今天写点某部分人看不起的css玩玩! 转换 转换属性transform: 浏览器前缀: -webkit-transform;-o-transform;-moz-transform;-ms-transform; 取值: none : 默认值,没有转换操作 transform-function:一组转换函数 transform:函数1() 函数2() ......; 转换的原点transform-origin 在不指定原点前提前,默认原点为元素的中心处 取值:数值/百分比/

D3.js 动画 过渡效果 (V3版本)

一 . 过渡的启动 启动过渡效果,与以下四个方法相关: d3.transition([selection],[name]) //创建一个过渡对象.但是由于每个选择集中都有transition()方法,可用d3.select("rect").transition()的方式来创建过渡,因此一般不直接用d3.transition(). transition.delay([delay]) //设定延迟的时间.过渡会经过一定时间后才开始发生.单位是毫秒. transition.duration(

Icicle partition,这里的点击事件很厉害。

<!DOCTYPE html> <html> <head> <title>Icicle</title> <script type="text/javascript" src="../d3.min.js"></script> <script type="text/javascript" src="Icicle.json"></s

(二)联动的饼图与柱形图

1.  前言 2.  联动的饼图与柱形图 图: 本地链接:http://127.0.0.1/Example/case4/pie-bar.html 知识点: 1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <style> 4 body{ 5 width:1060px; 6 margin:50px auto; 7 } 8 path { stroke: #fff; } 9 path:hover { opacity:

UGUI学习(一)Canvas

Canvas(画布) The Canvas is the area for all UI elements to be inside. The Canvas is a Game Object with a Canvas component on it, and all UI elements must be children of such a Canvas. 所有的UI元素都会被放置在一个叫做Canvas(画布)的地方,Canvas是一个游戏物体,它自带一个Canvas游戏组件,所有的UI袁旭

NanUI | NanUI 0.7 正式发布

2020年2月10日 NanUI 0.7版正式发布. 回顾过去的一年,浑浑噩噩.生活上.工作上太多的压力和变数让我身心疲惫,目睹亲人被病痛的摧残的痛苦,无法释怀的生死别离令我沉沦许久:公司业务的变动,方向的调整,好基友的离职让我对未来的职业规划感到无比迷茫,太多的事情让我应接不暇,因此也搁置了NanUI项目的开发.在此向各位给予了NanUI期待的朋友表示深深的歉意.随着时间的流逝,不知不觉2019年的时光在我的生命中飞逝,一转眼来到了11月份,看着GitHub上空荡荡的Release Notes

【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

[Android 仿微信通讯录 导航分组列表-上]使用ItemDecoration为RecyclerView打造带悬停头部的分组列表 一 概述 本文是Android导航分组列表系列上,因时间和篇幅原因分上下,最终上下合璧,完整版效果如下: 上部残卷效果如下:两个ItemDecoration,一个实现悬停头部分组列表功能,一个实现分割线(官方demo) 网上关于实现带悬停分组头部的列表的方法有很多,像我看过有主席的自定义ExpandListView实现的,也看过有人用一个额外的父布局里面套 Rec

[转]Asp.Net MVC使用HtmlHelper渲染,并传递FormCollection参数的陷阱

http://www.cnblogs.com/errorif/archive/2012/02/13/2349902.html 在Asp.Net MVC 1.0编程中,我们经常遇见这样的场景,在新建一个对象时候,通过HtmlHelper的方式在View模型中渲染Html控件,当填写完相关内容后,通过Form把需要新建的内容Post回View对应Controller的Action(例如:Create),指定的Action可以通过接受FormCollection参数.值参数或者某个类的实例参数(比如: