在本教程的第一个自定义程序中,您学习了怎样创立运用视图展示部分中的和后续系列,以在您的中创立深度实在页面感。
在这部分中,将学习自定义导航并运用到一个以创立合集的方法,然后将您的学习内容翻开。
入门
在 Xcode 中翻开项目。现在,当您的行为一来翻开教程的页面时,您就可以从本页面滑入。UINavigationController的默许转化。在但时,自定义的自定义过渡将如下所示:
自定义转化用户喜欢在关闭和翻开情况之间的天然方法为设置动画。
是时分初步了!
创立您的自定义导航控制器
要在远程或您弹出上单击自定义转化,有必要创立自定义导航控件并结束UINavigationControllerDelegate
。
iOS\Source\Cocoa Touch 类将新文件命名为 CustomNavigationController**。确保它是UINavigationController的子类和言语为**斯威夫特。单击*,然后单击创立*。
翻开CustomNavigationController.swift将其内容替换为以下内容:
导入UIKit
类CustomNavigationController : UINavigationController , UINavigationControllerDelegate {
掩盖func viewDidLoad () {
super .viewDidLoad()
//1
托付=自己
}
//2
func navigationController ( navigationController : UINavigationController , animationControllerForOperation operation : UINavigationControllerOperation , fromViewController fromVC : UIViewController , toViewController toVC : UIViewController ) -> UIViewControllerAnimatedTransitioning ? {
假设操作==。推{
回来零
}
假设操作==。盛行{
回来零
}
回来零
}
}
这是您的代码中的任何事项:
- 在
viewDidLoad
您自己将导游设置为自己的托付。 -
navigationController(_:animationControllerForOperation:fromViewController:toViewController:)
您可以在其时视图的控制方法或标准转化时实行此命令,而且您的回来代码可以是从回来的方法之一UINavigationControllerDelegate
。快将替换为您自己的自定义转化方针。nil
现在你现已设置了自定义导航控制器,是替换板中的默许导航控制器时分的故事了。
翻开 Main.storyboard并单击左面故事板视图系列结构中的**导航控制器。接下来,单击Identity Inspector在Custom Class下,将UINavigationController更改为CustomNavigationController,如下所示:
您制作并工作以确保全部正常;自从回来nil
托付方法后,什么都不会改动,该方法默许为导航系统的标准转化。
创立自定义过渡
是时分进入有趣的部分了——制作你的自定义过渡方针!:]
运用自定义方法过渡方针,您创立的有必要类的UIViewControllerAnimatedTransitioning协议,特别是契合以下条件:
- 过渡动画的持续时刻:有必要同步回来。
- animateTransition:有必要。供应您正在转化的此程序。多种深重的作业将在中结束。
- 动画结束:任选。过渡结束时告诉您。您可以在此方法中实行所需的收集。
你设置的过渡
iOS\Source\Cocoa Touch Class模板将新文件命名为BookOpeningTransition**。确保它是NSObject的子类和言语**斯威夫特。单击*,然后单击创立*。
翻开BookOpeningTransition.swift将其内容替换为以下内容:
导入UIKit
//1
类BookOpeningTransition : NSObject , UIViewControllerAnimatedTransitioning {
// MARK: 存储的特色
var transforms = [ UICollectionViewCell : CATransform3D ]() //2
var toViewBackgroundColor: UIColor ? //3
var isPush = true //4
//5
// MARK: UIViewControllerAnimatedTransitioning
func transitionDuration ( transitionContext : UIViewControllerContextTransitioning ) -> NSTimeInterval {
回来1
}
func animateTransition ( transitionContext : UIViewControllerContextTransitioning ) {
}
}
查看每个谈论部分:
-
BookOpeningTransition
结束UIViewControllerAnimatedTransitioning
协议所需的方法。 - 字典
transforms
存储键值对,其中键是一个单元UICollectionViewCell
,值是类型CATransform3D
。该字典在翻开时跟踪每个格的页面转化。 - 这定义了您过渡到的颜色,这变淡看起来更洁净。
- 布尔值
isPush
确定是消费者仍是发起, - 在这里,您需求的方法是差错的添加
UIViewControllerAnimatedTransitioning
;您很快就会结束这些方法。
现在你现已设置了变量,是时分结束协议的方法了。
将把的内容替换为transitionDuration(_:)
以下内容:
假设是推{
回来1
} 不管怎样{
回来1
}
transitionDuration(_:)
回来转化动画的持续时刻。在这种情况下,它在广泛或现时您希望运用 1 秒。这种方法可以让您轻松更改下或发起的时刻。
您需求结束第二个有必要的传送协议——animateTransition
魔法将发生的当地!:] 您将分两部分结束:
-
animateTransition
辅佐方法来安装。 -
animateTransition
结束辅佐方法来设置pop。
创造创造转化
形象自己在现实生活中翻开一本书:
虽然很杂乱,但您只需求考虑动画的情况,让我们UIView
的方法animateWithDuration
如下处理情况之间的动画:
- 第一阶段是书合上的时分。
- 第 2 阶段是翻开书本的时分;这本上是您在本教程第 1 部分中创立的转化。
animateTransition(_:)
首要,在协议方法之前,您将有一些辅佐方法来处理这种结束情况。
在BookOpening中,将下面的代码添加到类中:Transition.swift
// MARK: 辅佐方法
func makespectiveTransform () -> CATransform3D {
var Transform = CATransform3DIdentity
Transform.m34 = 1.0 / - 2000
回来转换
}
代码回来一个转换,并在 z 轴上添加透视图。稍后将在运用期间帮助您动画转化您的视图。
情况 1 – 已关闭的书
,在后边添加以下代码makePerspectiveTransform
:
func closePageCell(转换格:BookPageCell) {
// 1
var = self .makePerspectiveTransform ()
// 2
假设cell.layer.anchorPoint.x == 0 {
// 3
转换= CATransform3DRotate (转换, CGFloat ( 0 ), 0 , 1 , 0 )
// 4
转换= CATransform3DTranslate (transform, - 0.7 * cell.layer.bounds.width / 2 , 0 , 0)
// 5
转换= CATransform3DScale (转换, 0.7 , 0.7 , 1 )
}
// 6
甭说{
// 7
转换= CATransform3DRotate (转换, CGFloat ( - M_PI ), 0 , 1 , 0 )
// 8
转换= CATransform3DTranslate (转换, 0.7 * cell.layer.bounds.width / 2 , 0 , 0 )
// 9
转换= CATransform3DScale (转换, 0.7 , 1 )
}
//10
cell.layer.transform =转换
}
回想一下,BookViewController是页面的集结视图。您的页面以结束与书脊方法的集结视图,并在轴上旋转它以关闭翻页效果。(或页面)转化为合适的并合适的书本封面。
这是的转化快速说明:
下面是结束这一点的代码的解说:
- 运用您之前创立的辅佐方法初始化一个新的转化。
- 查看单元是否为正确。
- 假设是这样,根据它的态度设置为以0翻开办理。
- 将图片移到封面的中心。
- 将x和y上的缩放份额0.7。回想一下,您在上一个教程中将封面人物缩放到0.7,以防您想知道这个独特的数字来自哪里。
- 假设格不是标签页,它有必要是左面页面。
- 将左面页面的方位设置为180。因此,您希望将其到册页的方位是平整的。
- 将页面移动到背面的中心。
- 将页面缩放回0.7。
- 终究,设置单元格的转换。
现在在上面添加的方法下面添加方法:
func setStartPositionForPush ( fromVC : BooksViewController , toVC : BookViewController ) {
// 1
toViewBackgroundColor = fromVC.collectionView ? 。布景颜色
toVC.collectionView ? .backgroundColor = nil
//2
fromVC.selectedCell() ? .alpha = 0
//3
关于 toVC.collectionView !.visibleCells() 的单元格为![册页细胞转换] {
//4页
细胞转换[.transform] = cell.layer
//5
关闭页面单元格(unitg)
cell.updateShadowLayer()
//6
假设让 indexPath = toVC.collectionView ? .indexPathForCell(细胞) {
假设 indexPath.row == 0 {
cell.shadowLayer.opacity = 0
}
}
}
}
setStartPositionForPush(_:toVC:)
设置过渡的第 1 个阶段。它需求两个视图来制作动画:
-
fromVC
,BooksViewController类型,让您翻滚阅读您的书本列表。 -
toVC
,属于BookView类型,可以让您翻阅选择书本控制器的页面。
这是这段代码中发生的作业:
-
存储BooksViewController的视图的布景颜色,并将BookViewController的集结视图布景设置为集结
nil
。 - 躲藏的精选图像封面。
toVC
现在将处理封面的闪现。 - 循环阅读册页。
- 将每个页面的其时转化保存在其翻开情况。
- 书本从情况初步,将会将页面关闭转化为**关闭并更新您的图层。
- 终究,加载图像的承载。
情况2——翻开的书
现在您现已结束了情况 1 的转化,您可以继续进行情况 2,从合上的书到翻开的书。
在下面添加以下方法setStartPositionForPush(_:toVC:)
):
func setEndPositionForPush ( fromVC : BooksViewController , toVC : BookViewController ) {
//1
关于 fromVC.collectionView !.visibleCells() 中的单元格为![ BookCoverCell ] {
单元格.alpha = 0
}
//2
关于 toVC.collectionView !.visibleCells() 中的单元格为![册页] {
cell.layer.transform = [细胞]!
cell.updateShadowLayer(动画:真)
}
}
深入研究的代码:
- 躲藏书本封面,因为您正在展示全部精选书本的页面。
- 在 BookViewController中保存阅读书本的页面并加载从前的翻开转化。
从BooksViewController追踪到BookController之后,需求进行一些收拾作业。
在上面添加的方法之后添加下面的方法:
func cleanupPush ( , toVCViewController , toVC ) {
将添加回的视图控制器: BookViewController 到布景
VC 。.backgroundColor = toViewBackgroundColor
}
在保存全部内容之后,您将看到 BookViewController集结的布景颜色设置为您的布景颜色躲藏在后边。
实施开书过渡
现在你现已有你的方法了,你现已准备好感应激活了animateTransition(_:)
!
//1
让容器= transitionContext.containerView()
//2
假设是推{
//3
让 fromVC = transitionContext.viewControllerForKey( UITransitionContextFromViewControllerKey ) 为!BooksViewController
让 toVC = transitionContext.viewControllerForKey( UITransitionContextToViewControllerKey ) 为!BookViewController
//4
container.addSubview(toVC.view)
// 实行过渡
//5
self .setStartPositionForPush(fromVC, toVC: toVC)
UIView .animateWithDuration( self .transitionDuration (transitionContext), delay: 0.0 , usingSpringWithDamping: 0.7 , initialSpringVelocity: 0.7 , options: nil , animations: {
//6
self .setEndPositionForPush(fromVC, toVC: toVC)
},结束:{结束于
//7
self .cleanupPush(fromVC, toVC: toVC)
//8
transitionContext.completeTransition(结束)
})
} 不管怎样{
//盛行音乐
}
这是发生的作业animateTransition(_:)
:
- 获取储物柜视图,查看其切换视图之间的超级棒。
- 假设您正在实行用户。
- 假设是这样,获取
fromVC
(BooksViewController) 和toVC
(BookViewController)。 - 将( BookViewController
toVC
)添加到包含视图。 - 为和从视图关闭设置的情况。
- 情况,您从情况(Opened State ) 动画到结束方位 (Opened State)
- 实行任何收拾。
- 告诉系统过渡结束。
将遥控转化运用到导航
现在您现已设置了阅读器,是时分将其运用您的自定义导航系统了。
翻开 BooksViewController.swift并在类声明之后添加以下特色:
var过渡:BookOpeningTransition
特色跟踪您的转化是现在让您知道的转化。
在结束大括号后添加以下扩展名:
扩展BooksViewController {
func animationForPresentController ( vc : UIViewController ) -> UIViewControllerAnimatedTransitioning? {
// 1
var过渡= BookOpeningTransition ()
// 2
过渡.isPush = true
// 3
self .transition =过渡
// 4
回来过渡
}
}
这将用于创立代码与设置的相关方法部分,在这种情况下,您希望将其扩展为一个分组。
细心看一下代码:
- 创立一个新的过渡。
- 您正在展示自己的风格,或许因此设置
isPush
为true
- 保存暂时过渡。
- 回来过渡。
现在翻开CustomNavigationController.swift将推送句子替换为以下内容:if
假设操作==。推{
假设让 vc = fromVC 作为BooksViewController {
回来 vc.animationControllerForPresentController(toVC)
}
}
这将查看您的调用控制器的控制器是否闪现控制器,闪现控制器的转化图书**视图的:BookOpening。
并为您制作您的运用程序;翻开您的选择工作,会从这本书看到的一个动画程序:
呃。。怎样没有动画?
它直接从一本合上的书跳到一本翻开的书,因为你还没有加载页面的单元格!
太阳从BooksViewController转化到BookViewController,它们都是UICollectionViewControllers。UICollectionView单元格不会在主线程上,因此导航时您的代码会在看到零个单元初步加载 – 而且没有任何动画!
您需求给集结视图的时刻来加载全部单元格。
翻开BooksViewController.swift并替换为以下内容:openBook(_:)
func openBook(书:书?) {
让 vc =故事板?.instantiateViewControllerWithIdentifier( "BookViewController" ) 为!BookViewController
vc.book = selectedCell() ? .book
//1
vc.view.snapshotViewAfterScreenUpdates( true )
//2
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self .navigationController ? .pushViewController(vc, 动画: true )
回来
})
}
下面是处理您问题的方法:
- 您奉告 BookViewController在兼并更改后创立快照。
- 确保在主网上有BookViewController以运用单元时刻加载。
再次构建并工作您的运用程序;您应该会看到这本书在每周正确的动画:
出现了许多!
您现在现已结束了转化,可以继续进行发起。
结束 Pop Helper 方法
舞台是画面与现在正在其时情况2现在正在开书。
翻开 BookOpeningTransition.swift并添加以下代码:
// MARK: 弹出窗口
函数 setStartPop ( from BookViewController : BookViewController ) { // sitionView从VC的视图
中删去布景
到VC.collectionViewController ? 。布景颜色
从VC.collectionView ?.backgroundColor = nil
}
setStartPositionForPop(_:toVC)
只需留意存储 BookViewController 的集结视图的颜色,并移除BookViewController的集结视图的。请留意,您无需设置单元转化,因为这本书其时闪现任何布景情况。
setEndPositionForPop(_:toVC)
在上面刚刚添加的代码之后当即添加以下代码:
func setEndPositionForPop ( fromVC : BookViewController , toVC : BooksViewController ) {
//1
让coverCell = toVC.selectedCell()
//2
关于toVC.collectionView !.visibleCells() 中的单元格为![ BookCoverCell ] {
假设细胞!=掩盖细胞{
单位格.alpha = 1
}
}
//3
关于来自VC.collectionView !.visibleCells() 中的单元格为![册页] {
关闭页面单元格(unitg)
}
}
设置方法从翻开到关闭此弹出转化的结束情况:
- 获取精选的书本封面。
- 在关闭书本的情况下,遍历全部BooksViewController中的书皮并将它们全部淡化。
- 在BookViewController中循环其时书的全部页面,将单元格转化为关闭情况。
现在添加以下方法:
func cleanupPop ( , toVCView : toVCViewController ) {
将添加回BookController的ViewControllerfrom
布景VC。.backgroundColor = self .toViewBackgroundColor
// 吊销躲藏原书封面
toVC.selectedCell() ? .alpha = 1
}
翻开转化结束后,此会实行一些整理。进程闪现将BooksViewController的方法视图布景设置原始情况和原始书本封面。
现在在注释的代码块animateTransition(_:)
内的协议方法中添加以下代码:else``//POP
//1
让 fromVC = transitionContext.viewControllerForKey( UITransitionContextFromViewControllerKey ) 为!BookViewController
让 toVC = transitionContext.viewControllerForKey( UITransitionContextToViewControllerKey ) 为!BooksViewController
//2
container.insertSubview(toVC.view, belowSubview: fromVC.view)
//3
setStartPositionForPop(fromVC, toVC: toVC)
UIView .animateWithDuration(self .transitionDuration (transitionContext),动画:{
//4
self .setEndPositionForPop(fromVC, toVC: toVC)
},结束:{结束于
//5
self .cleanupPop(fromVC, toVC: toVC)
//6
transitionContext.completeTransition(结束)
})
下面是pop过渡动画的作业原理:
- 获取过渡是中涉及的视图控制器。
fromVC
现在是BookViewController(翻开的书本情况),toVC
是BooksViewController(关闭的书本情况)。 - 在包含视图中的BookViewController栏目中添加BooksViewController 。
-
setStartPositionForPop(_:toVC)
将其设置为之前存储的布景颜色nil
。 - 从翻开的书本情况动画到合上的书本情况。
- 动画结束后,经过将布景颜色设置回其原始颜色,并经过封面来展示画作。
- 告诉过渡结束。
将 Pop 过渡运用到导航系统
现在您需求设置转化设置选项。
翻开 BooksViewController.swift并在后边添加以下方法animationControllerForPresentController(_:)
:
func animationControllerForDismissController ( vc : UIViewController ) -> UIViewControllerAnimatedTransitioning? {
var过渡= BookOpeningTransition ()过渡
.isPush = false
self.transition =过渡
回来过渡
}
这再次创立了一个新的BookingTransition,但仅有的区别是转化现在设置为发起。
现在翻开CustomNavigationController.swift将弹出句子替换为以下内容:if
假设操作==。盛行{
假设让 vc = toVC 为?BooksViewController {
回来 vc.animationControllerForDismissController(vc)
}
}
这将回来过渡并实行动画以关闭本书。
制作并工作您的运用程序;选择一本书以查看它的翻开和关闭,如下所示:
创立导航网
但你的过渡动画看起来很不错——!
首要,翻开BookOpeningTransition.swift并添加以下特色:
// MARK : 运用Transfer
varactive:UIPercentDrivenInteractive?
翻开CustomNavigationController.swift并添加以下代码:
func navigationController ( navigationController : UINavigationController , interactionControllerForAnimationController animationController : UIViewControllerAnimatedTransitioning ) -> UIViewControllerInteractiveTransitioning? {
假设让动画工程师=动画工程师为?BookOpeningTransition {
回来动画教程。
}
回来零
}
在上面的中,您从BookOpeningTransition
。这导航系统可以运用监视动画的模式,以便用户可以运用东西制作东西或合上一个。
现在翻开BooksViewController.swifttransition
并在变量下添加以下特色:
//1
变量驱动程序:UIPercentInteractiveTransition
?UIGestureRecognizer ? {
设置{
假设让辨认器=辨认器{
集结视图?.addGestureRecognizer(辨认器)
}
}
}
这便是您添加这些变量的原因:
-
interactionController
是类UIPercentDrivenInteractiveTransition
的控件,它可以在控件之间运用动画转化进出类型,运用东西还可以结束,它是一个运用在一个运用程序之间**UIViewControllerTransitioning的自定义方针。您现已创立了协议BookOpeningTransition — 正是支撑的!iteractionController
可以文档控制其作业和恳求闪现此控制器之间的相关。了解有关课程的更多信息,阅读Apple 的相关原理的相关信息。 -
recognizer
是一个UIGestureRecognizer。您将运用一个辨认器来捏合这本书。
现在在 BooksViewController扩展的transition.isPush = true
行下添加以下代码段:animationControllerForPresentController(_:)
交互控制器
= transition.interactionController
让您的导航东西知道怎样运用您的定制东西。
将相同的代码添加到animationControllerForDismissController(_:)
,下transition.isPush = false
:
交互控制器
= transition.interactionController
将以下代码添加到viewDidLoad()
:
辨认器= UIPinchGestureRecognizer(方针:自我,动作: “handlePinch:”)
这会初始化一个UIPinchGestureRecognizer,它答应用户操作方法实行捏合handlePinch(_:)
。
像这样实行下面的动作viewDidLoad()
:
// MARK: 辨认动作
func handlePinch:UIPinchestureRecognizer) {
切换辨认器.state {
案例.初步:
//1替代驱动
器InteractiveTransition ()
//假设器
.view = View { //3
假设器.view = View {
//
4 var book = self -selectedCell ( ) .book
//5 self .openBook(书)
}
//6
} 不管怎样{
//7
导航控制器?.popViewControllerAnimated(真)
}
案例.更改:
//8
假设过渡!.isPush {
//9
var progress = min ( max ( abs ((recognizer.scale - 1 )) / 5 , 0 ), 1 )
//10
替代品?.updateInteractiveTrans(提示)
//11
} 不管怎样{
//12
var progress = min ( max ( abs (( 1 - Recognizer .scale)), 0 ), 1 )
//13
替代品?.updateInteractiveTrans(提示)
}
案例结束:
//14
替代品?.finishInteractive Transition()
//15个
资源=无
默许:
休憩
}
}
UIPGestureRecognizer,您将跟踪不同的情况。情况初步您**紧缩何时初步。情况更改了检测捏合的改动,并结束让您知道捏合何时结束。
您的代码结束的概要handlePinch(_:)
如下:
初步情况
- 实例化一个UIPercentDrivenInteractiveTransition方针。
- 假设另一种夹点距离大于或之间的类似
1
。 - 假设是这样,请确保您所看到的视图是集结视图。
- 捉住被捏的书。
- 实行BookViewController的**发布以闪现书的页面。
- 假设规划
1
…… - …实行BookViewController的**pop以再次闪现书本封面。
改动情况——捏合时
- 查看其时是否转化正在实行推送。
-
假设正在您的用户到BookController ,有必要获取您
progress
的捏合款式。查看和之间。将捏捏缩小缩小其一个的五分之一;这使得翻开一本使过渡。否则书会当即跳到翻开情况。progress``0``1
- 根据您计算之前的更新现已结束的转化。
- 假设没有触发触发,那么它现在有必要触发。
- 合上书本时,有必要从1变成。
- 终究,更新终究。
结束情况 – 间断捏合
- 告诉系统转化的用户已注册。
- 将东西用于
nil
。
因此,您有必要将情况提交给控制器,以便它可以自行发起。
翻开BookViewController.swiftbook
,并在变量下添加以下特色:
变量辨认器:UIGestureRecognizer? {
设置{
假设让辨认器=辨认器{
集结视图?.addGestureRecognizer(辨认器)
}
}
}
每逢您在BookViewController中的设置当即辨认器中,该闪现将添加到集结中,以便您可以在用户合上本本时跟踪合合时的内容*。*
,您需求在Book和BookViewController之间以及**ViewController之间。
翻开BookOpenTransition.swift设置。随后添加到cleanUpPush(_:toVC)
您的设置布景点:
// 搬运辨认器
toVC.recognizer = fromVC.recognizer
BooksViewController将带着到**BookViewController传递到BookViewController,然后将捏合类型。
当您从BookViewController弹出到BooksViewController的时分,您有必要将捏合传回。
移动到cleanUpPop(_:toVC)
设置布景颜色之后:
// 搬运辨认器
toVC.recognizer = fromVC.recognizer
构建并工作您的运用程序;任何一本书并运用捏合选择翻开并关闭这本书:
捏合也是翻开和关闭的天然机制;这是一个捡漏的机遇。
翻开 Main.storyboard,选择Custom Navigation View Controller,翻开 Attributes Inspector 并吊销吊销闪现Navigation Controller部分下的Bar Visibility ,如下:
再次构建并工作您的运用程序:
结论
您可以运用教程中的全部代码部分下载终究项目。
在教程中怎样自定义运用程序,您还供应了更多的学习视图,以便用户运用更天然、更方便地运用本教程创立自定义运用程序,并运用本教程来创立和合上运用程序您的运用程序同时处理了相同的基本问题,并运用了更多的个性化程序,它从其他运用程序中运用程序帮助。
运用默许的“缓入/缓出”动画更?好吧,您可以考虑开发一些时刻。但是最好的运用程序有额定的定制修饰,使它们的发光效果。每个人都记得他们下载的运用很有趣的运用程序;你知道,那些给你带来一点UI影响,但又不实用性的东西。
这里也引荐一些面试相关的内容!
-
① BAT等各个大厂iOS面试真题+答案大全
-
② iOS中高级开发必看的抢手书本(经典必看)
-
③ iOS开发高级面试”简历制作”辅导
-
④ iOS面试流程到基础知识大全