标签:根据 elf 宽高 页面 point 一点 系统默认 一个 containe
刚开始从 Android 转到 iOS 写应用时,发现 iOS 的界面之间切换真方便,什么都不用写都有不错的转场动画,除了简单的平移、底部弹出,甚至还有 3D 旋转和翻页效果,而 Android 那系统默认转场是屏幕闪一下。
尽管系统提供的方式已经满足大部分场景了,但也没法挡住审美疲劳啊,所以就需要自定义转场动画了。
先看个效果图:
刚开始写 iOS 时看到这种会动会弹的效果一直都是懵的,心里觉得这一定非常复杂,等到真正沉下心去学时,发现只要搞清楚每个步骤,这一点都不难。
1、实现 UIViewControllerTransitioningDelegate
比如我的第一个页面叫 FirstViewController,单击底部任意一个按钮都会以 present 方式打开 SecondViewController。点击按钮触发的代码如下:
|
|
实现 UIViewControllerTransitioningDelegate 的两个方法
|
|
暂时给 present 和 dismiss 都返回 nil
2、编写具体的转场动画
先分析效果图的中的打开动画,SecondViewController 是从当前点击按钮的位置和大小,放大的同时改变中心点,达到了最终的全屏显示。
|
|
再看 dismiss 动画。SecondViewController 由全屏缩小一半到屏幕中心,再向上平移到屏幕外。
|
|
present 和 dismiss 的转场动画写完了,就该把开始 return nil 的地方替换掉了。
|
|
我添加的 3 个按钮都是固定位置的,并没有滚动条,所以可以直接使用。但如果是在 UIScrollView、UITableView 或 UICollectionView 中,那就需要转换一下 frame 了。
既然 Present 和 Dismiss 的转场可以自定义,那 UINavigationController 的 Push 和 Pop 肯定也是可以的,实现同样的效果,动画代码可以用同一份,只需设置不同的 delegate 即可。
给 FirstViewController 套一个 UINavigationController,按钮触发的代码修改为:
|
|
实现 UINavigationControllerDelegate:
|
|
就这么简单
标签:根据 elf 宽高 页面 point 一点 系统默认 一个 containe
原文地址:https://www.cnblogs.com/wangziqiang123/p/11711044.html