澳门威利斯人_威利斯人娱乐「手机版」

来自 办公软件 2020-04-24 09:14 的文章
当前位置: 澳门威利斯人 > 办公软件 > 正文

可以很酷的转场动画,Music卡片弹出动画的实现

正文翻译总括自AppCoda以下两篇文章:

奥门威尼斯人游戏 1

用作程序猿,不是在奋斗正是在奋斗的中途。碰上集团赶项目标时候更是如此。不过,再怎么忙休息的时候也要收取时间来放放松。健美,音乐,旅游。学会管理本人的生活技能活得更轻巧。

  • Introduction to Custom View Controller Transitions and Animations
  • Creating a Slide Down Menu Using View Controller Transition

在iOS开拓中,分界面间的跳转其实约等于调节器的跳转,跳转有无数种,最常用的有push,modal.

说了那样多该回到正题。近日在听音乐时意识Apple Music的卡牌弹出动漫很风趣,探讨了少时就准备练练手。也许有意无意想把自定义动漫内容整理收拾。最后完结的职能图如下所示

iOS 7最早,苹果为开垦者提供了自定义调整器转场动漫相关的API,而达成该效能必要以下多少个步骤:

  • modal:任何调控器都能由此Modal的花样展⽰出来.效果:新调整器从显示器的最尾部往上钻,直到盖住在此以前的调整器为⽌.系统也会包括三个动漫.

奥门威尼斯人游戏 2AppleMusic.gif

  • 创设八个类作为动漫微处理机,该类需三番五次自NSObject并遵从UIViewControllerAnimatedTransitioning左券,我们在这里个类中编辑大家的动漫片实行代码。
  • 为对象调控器内定转场动漫代理,既可以够行使上一步创制的卡通微机对象,也能够内定来源调节器作为这几个代理。
  • 兑今世理公约中的相应措施,在措施中回到第一步创立的动漫片微型机对象。

在支付在此之前把一些自定义转场动漫先过一下

下载示例程序,地址在此。(译注:原来的文章地址必要FQ访谈,本身已转存到GitHub上,点击这里。)

public func presentViewController(viewControllerToPresent: UIViewController, animated flag: Bool, completion:  -> Void)?)public func dismissViewControllerAnimated(flag: Bool, completion:  -> Void)?)

在iOS开辟中有相通会自定义二种转场动漫

演示程序如下图所示,点击导航栏上的Action开关会modal出二个对象调节器,点击Dismiss开关会再次来到来源调节器,只可是以后选择的是系统暗中认可的modal动漫,接下去大家就来促成自定义转场动漫。

  • push: 在push中,调控器的军事管制实际上交给了UINavigationController,所以在push调节器的时候必得得到相应的领航调节器. 效果:从右往左现身,系统会蕴藏三个暗中认可动漫.
  • 导航栏动画---供给有导航栏,把下个调节器替换为当前调节器
  • modal 动漫--- 把下个调节器的视图覆盖到眼下的视图下面

奥门威尼斯人游戏 3

奥门威尼斯人游戏,安装当前要跳转的调节器的代理例如:固守左券UINavigationControllerDelegate举个例子self.navigationController.delegate = self;兑现代理方法:

始建三个类名字为CustomPresentAnimationController,世袭自NSObject并遵循UIViewControllerAnimatedTransitioning公约。那么些协议有八个必得兑现的办法,大家的兑今世码如下:

public func pushViewController(viewController: UIViewController, animated: Bool) public func popViewControllerAnimated(animated: Bool) -> UIViewController?
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationControllerif (operation == UINavigationControllerOperationPush) { return self.pushAnimation; }else if (operation == UINavigationControllerOperationPop){ return self.popAnimation; } return nil;}
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval { return 2.5} func animateTransition(transitionContext: UIViewControllerContextTransitioning) { let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! let finalFrameForVC = transitionContext.finalFrameForViewController(toViewController) let containerView = transitionContext.containerView() let bounds = UIScreen.mainScreen().bounds toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height) containerView.addSubview(toViewController.view) UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: .CurveLinear, animations: { fromViewController.view.alpha = 0.5 toViewController.view.frame = finalFrameForVC }, completion: { finished in transitionContext.completeTransition fromViewController.view.alpha = 1.0 })}

push和model都有系统提供转场动漫效果,但有时候系统提供的不自然能满意开荒须求,那就要求去自定义,说真话自定义转场动漫依旧略略麻烦的.但原理其实相当轻便.

在上述代理方法中回到遵循UIViewControllerAnimatedTransitioning合计的目的。而回到的靶子分为两类:

率先个点子很简短,设定动漫试行时间。第3个章程则用来编排大家自定义的动漫片代码,在此个主意中大家得以行使transitionContext来获取我们以往的来自笔者调控制器、指标调控器、动画达成后的末段frame,还足以拿走用来管理来源或指标视图的器皿视图。

转场动漫的原理:

一个是兑现push时的卡通片对象,另一个是落到实处pop的动漫片对象,只怕贰个何况贯彻三种动漫方法的指标。

下一场大家将目标视图调治到显示屏下方并将其增添到容器视图内。接下来在动漫实行的闭包内,将指标视图的岗位变为最后地点,并以后自视图的反射率降为0.5,使其在目的视图步向的长河中发生三个脱离的成效。在动漫实现的闭包内,我们报告transitionContext动漫已产生,并未来自视图的光滑度改回1.0。

当七个调整器发生push.pop或modal.dismiss的时候,系统会把原来的调节器放到担当转场的调控器容器中,也会把目的调控器放进去,然而对象调整器是不可知的,因而大家要做的正是把新的调控器显现出来,把老的调控器移除掉.超级粗略吗!

那八个指标都必须要要遵循UIViewControllerAnimatedTransitioning情商况且要促成三个章程

接下去大家必要为指标调整器设置转场动漫代理,这里大家钦命来源调控器作为大家的代理。在ItemsTableViewController中,让其坚守UIViewControllerTransitioningDelegate协议,在storyboard中找到我们modal的segue,设置它的Identifier为showAction。然后在ItemsTableViewController中加多如下代码:

上边大致介绍了须臾间调控器的切换及原理,这篇小说大家希图说说自定义转场动漫,三个push三个modal,纵然自定义modal转场动漫用的比较多一点,但push也足以通晓一下嘛!先来看下效果,然后计划上车:

  • - (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
  • - animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
let customPresentAnimationController = CustomPresentAnimationController() override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "showAction" { let toViewController = segue.destinationViewController as UIViewController toViewController.transitioningDelegate = self }}func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return customPresentAnimationController}

奥门威尼斯人游戏 4自定义modal转场动漫奥门威尼斯人游戏 5自定义push转场动漫奥门威尼斯人游戏 6

率先个艺术是回来动漫的时长,第1个情势完结动漫的功力。

我们创设了二个卡通微处理机对象,设置目的调控器的转场代理为来源调整器,然后实现代理左券中的animationControllerForPresentedController方法,该办法用于钦命modal进程中显得视图的动漫,在该方式中回到大家自定义的动漫片微电脑对象。

很简短的modal效果,首先有一个主要调整制器,主要调控制器底部有七个scrollView,对scrollView里面图片增多手势监听,并在监听方法里面modal二个背景图片相像的调控器,那样就能够开头自定义转场动漫啦!

在modal在此以前设置presented的调控器的transitioningDelegate代理 ,并安装modalPresentationStyle 为Custom,而作为代理供给信守合同UIViewControllerTransitioningDelegateUIViewControllerAnimatedTransitioning比较导航栏的代理 ,present的代办也要遵循UIViewControllerAnimatedTransitioning,可是多了二个UIViewControllerTransitioningDelegate。它和导航栏的代理方法平时,前面一个是回去要兑现present和dismiss的代理,前者是回到要push和pop的代办。

运维大家的顺序,效果如下图所示:

  1. 新建二个后续 NSObject, UIViewControllerAnimatedTransitioning的PopAnimator文件,用于安装转场动漫的代办方法,在个中增多UIViewControllerAnimatedTransitioning公约应当要贯彻的八个代理方法:

具备的卡通都是在- animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext当中实行。

奥门威尼斯人游戏 7

收获当前的调节器presenting以至就要显示的调控器presented

跟系统暗中同意modal效果差不离,然而带有弹簧效果。即便你指望有例外的机能,你能够对上面那句代码实行订正。

 // 设置转场动画持续时间 func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { return 0 } // 执行转场动画 func animateTransition(transitionContext: UIViewControllerContextTransitioning) { }

fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height)
  1. 在ViewController中装置herbDetailsVc(每张图纸对应的调整器卡塔尔(قطر‎的 transitioningDelegate为温馨,为刚刚新建的文本设置二个常量 let transition = PopAnimator(卡塔尔国,新建一个extension遵从代理UIViewControllerTransitioningDelegate

toVc = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

例如说将其改为如下代码:

[transitionContext containerView]归来的是容器视图,动漫的贯彻正是要把八个调节器的view结合容器视图实行。在iOS 8,多少个调节器的视图能够经过上面包车型客车情势得到:

toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, -bounds.size.height)
extension ViewController: UIViewControllerTransitioningDelegate { func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return transition } func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { return nil }}
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];

重复运路程序,大家的modal动漫就改成从上往下了。

举例回到nil,这就应用系统暗中同意的转场动漫.

亟需在乎的是,上边七个措施在UIModalPresentationCustom 格局下的 Modal 转场 ,获取取得的将是 nil 。所以对与modal转场只能通过UITransitionContextToViewControllerKey获取fromView 和toView

奥门威尼斯人游戏 8

在PopAnimator的transitionDuration:方法中设置好时间.设定转场动漫的内容

modal和导航栏动漫的界别

  1. modal 不须求加多fromView到容器上,而导航栏动漫需求和睦增添上去
  2. 对此导航栏动漫,动漫截至后 系统会自动把fromView transitionContext容器中移除事,你也得以手动管理提前将 fromView移除。而modal动漫则不会移除掉fromView. 所以平日的卡牌动漫如Apple Music的弹出动漫,JD下单的卡片动漫都能够通过用modal来自定义实 现。

有多少个要留心的点:

  1. 底层的View会缩放,四个View都有圆角
  2. tableView和降落手势之间手势有冲突
  3. 手指下滑上层的卡牌有阻尼效果
  4. 上拉tableView到底层,再下滑tableView后加大,上层卡片会有弹簧的职能。

手势冲突的管理是在tableView里面完成

//实现后表示,允许多个手势识别器共同识别- gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}

接下来根据不一样的手势场景进行管理。阻尼效果的贯彻小编是应用了sin函数,来决定卡牌下滑的移位self.dampOffset = sin(W * point.y ) * dismissOffset;//简陋的阻尼效果

本文由澳门威利斯人发布于办公软件,转载请注明出处:可以很酷的转场动画,Music卡片弹出动画的实现

关键词: 澳门威利斯人 自定义 转场 动画 控制器