- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这是我的自定义转场代码
class FlipFromRightSegue: UIStoryboardSegue {
override func perform() {
let source:UIViewController = self.sourceViewController as UIViewController
let destination:UIViewController = self.destinationViewController as UIViewController
UIView.transitionWithView(source.view, duration: 1.0, options: .CurveEaseInOut | .TransitionFlipFromRight, animations: { () -> Void in
source.view.addSubview(destination.view)
}) { (finished) -> Void in
destination.view.removeFromSuperview()
source.presentViewController(destination, animated: false, completion: nil)
}
}
}
我认为这行得通,但实际上只有当转场已经执行时 View 才会改变。当“翻转”在中间时,我应该怎么做才能改变 View ?
提前致谢。
最佳答案
从 iOS 7 开始,我们通常不会使用自定义转场动画转换。我们要么使用标准模态表示,指定 modalTransitionStyle
(即,我们可以为模态转换选择的一些动画的固定列表),要么实现自定义动画转换。这两个描述如下:
如果您只是展示另一个 View Controller 的 View ,将动画更改为翻转的简单解决方案是在目标 View Controller 中设置 modalTransitionStyle
。您可以在 Interface Builder 中的 segue 属性下完全执行此操作。
如果您想以编程方式执行此操作,您可以在目标 Controller 中使用 Swift 3 执行以下操作:
override func viewDidLoad() {
super.viewDidLoad()
modalTransitionStyle = .flipHorizontal // use `.FlipHorizontal` in Swift 2
}
然后,当您调用show
/showViewController
或present
/presentViewController
时,您的演示将被执行水平翻转。而且,当您关闭 View Controller 时,动画会自动为您反转。
如果您需要更多控制,在 iOS 7 及更高版本中,您可以使用自定义动画转换,您可以在其中指定 .custom
的 modalPresentationStyle
.例如,在 Swift 3 中:
class SecondViewController: UIViewController {
let customTransitionDelegate = TransitioningDelegate()
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
modalPresentationStyle = .custom // use `.Custom` in Swift 2
transitioningDelegate = customTransitionDelegate
}
...
}
指定将实例化动画 Controller 的 UIViewControllerTransitioningDelegate
。例如,在 Swift 3 中:
class TransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return AnimationController(transitionType: .presenting)
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return AnimationController(transitionType: .dismissing)
}
}
动画 Controller 将简单地做 .transitionFlipFromRight
是一个演示,或者 .transitionFlipFromLeft
如果在 Swift 3 中关闭:
class AnimationController: NSObject, UIViewControllerAnimatedTransitioning {
enum TransitionType {
case presenting
case dismissing
}
var animationTransitionOptions: UIViewAnimationOptions
init(transitionType: TransitionType) {
switch transitionType {
case .presenting:
animationTransitionOptions = .transitionFlipFromRight
case .dismissing:
animationTransitionOptions = .transitionFlipFromLeft
}
super.init()
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
//let inView = transitionContext.containerView
let toView = transitionContext.viewController(forKey: .to)?.view
let fromView = transitionContext.viewController(forKey: .from)?.view
UIView.transition(from: fromView!, to: toView!, duration: transitionDuration(using: transitionContext), options: animationTransitionOptions.union(.curveEaseInOut)) { finished in
transitionContext.completeTransition(true)
}
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 1.0
}
}
有关 iOS 7 中引入的自定义过渡的更多信息,请参阅 WWDC 2013 视频 Custom Transitions Using View Controllers .
如果应该承认上面的 AnimationController
实际上是一种过度简化,因为我们正在使用 transform(from:to:...)
.这会产生不可取消的动画(如果您使用的是交互式过渡)。它还删除了“from” View 本身,从 iOS 8 开始,这实际上是呈现 Controller 的工作。
所以,您确实想使用 UIView.animate
API 来制作翻转动画。我很抱歉,因为以下涉及在关键帧动画中使用一些不直观的 CATransform3D
,但它会导致翻转动画,然后可以进行可取消的交互式转换。
所以,在 Swift 3 中:
class AnimationController: NSObject, UIViewControllerAnimatedTransitioning {
enum TransitionType {
case presenting
case dismissing
}
let transitionType: TransitionType
init(transitionType: TransitionType) {
self.transitionType = transitionType
super.init()
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let inView = transitionContext.containerView
let toView = transitionContext.view(forKey: .to)!
let fromView = transitionContext.view(forKey: .from)!
var frame = inView.bounds
func flipTransform(angle: CGFloat, offset: CGFloat = 0) -> CATransform3D {
var transform = CATransform3DMakeTranslation(offset, 0, 0)
transform.m34 = -1.0 / 1600
transform = CATransform3DRotate(transform, angle, 0, 1, 0)
return transform
}
toView.frame = inView.bounds
toView.alpha = 0
let transformFromStart: CATransform3D
let transformFromEnd: CATransform3D
let transformFromMiddle: CATransform3D
let transformToStart: CATransform3D
let transformToMiddle: CATransform3D
let transformToEnd: CATransform3D
switch transitionType {
case .presenting:
transformFromStart = flipTransform(angle: 0, offset: inView.bounds.size.width / 2)
transformFromEnd = flipTransform(angle: -.pi, offset: inView.bounds.size.width / 2)
transformFromMiddle = flipTransform(angle: -.pi / 2)
transformToStart = flipTransform(angle: .pi, offset: -inView.bounds.size.width / 2)
transformToMiddle = flipTransform(angle: .pi / 2)
transformToEnd = flipTransform(angle: 0, offset: -inView.bounds.size.width / 2)
toView.layer.anchorPoint = CGPoint(x: 0, y: 0.5)
fromView.layer.anchorPoint = CGPoint(x: 1, y: 0.5)
case .dismissing:
transformFromStart = flipTransform(angle: 0, offset: -inView.bounds.size.width / 2)
transformFromEnd = flipTransform(angle: .pi, offset: -inView.bounds.size.width / 2)
transformFromMiddle = flipTransform(angle: .pi / 2)
transformToStart = flipTransform(angle: -.pi, offset: inView.bounds.size.width / 2)
transformToMiddle = flipTransform(angle: -.pi / 2)
transformToEnd = flipTransform(angle: 0, offset: inView.bounds.size.width / 2)
toView.layer.anchorPoint = CGPoint(x: 1, y: 0.5)
fromView.layer.anchorPoint = CGPoint(x: 0, y: 0.5)
}
toView.layer.transform = transformToStart
fromView.layer.transform = transformFromStart
inView.addSubview(toView)
UIView.animateKeyframes(withDuration: self.transitionDuration(using: transitionContext), delay: 0, options: [], animations: {
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.0) {
toView.alpha = 0
fromView.alpha = 1
}
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) {
toView.layer.transform = transformToMiddle
fromView.layer.transform = transformFromMiddle
}
UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.0) {
toView.alpha = 1
fromView.alpha = 0
}
UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
toView.layer.transform = transformToEnd
fromView.layer.transform = transformFromEnd
}
}, completion: { finished in
toView.layer.transform = CATransform3DIdentity
fromView.layer.transform = CATransform3DIdentity
toView.layer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
fromView.layer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
})
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 1.0
}
}
仅供引用,iOS 8 使用演示 Controller 扩展了自定义转换模型。有关详细信息,请参阅 WWDC 2014 视频 A Look Inside Presentation Controllers .
无论如何,如果在转换结束时,“from” View 不再可见,您将指示您的展示 Controller 将其从 View 层次结构中移除,例如:
class PresentationController: UIPresentationController {
override var shouldRemovePresentersView: Bool { return true }
}
而且,很明显,您必须将此表示 Controller 告知您的 TransitioningDelegate
:
class TransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
...
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
return PresentationController(presentedViewController: presented, presenting: presenting)
}
}
此答案已针对 Swift 3 更新。请参阅 previous revision of this answer如果您想查看 Swift 2 实现。
关于swift - Swift 中的自定义 Flip Segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26074979/
我正在开发一款小型多人 2d 平台游戏。我已经设法让它在网络上复制动画、移动和翻转 Sprite ,但我有一个我无法理解的错误。翻转 Sprite 的代码非常适合主持人——他可以看到其他玩家在左转或右
好吧,简单的 css 翻转 .container .flipper.A .front .back .flipper.B .front .back 对
我有以下类型定义: newtype Flip f a b = Flip (f b a) deriving (Eq, Show) Flip 数据构造函数是否有一个或三个参数? 考虑以下实现: dat
给定一个用于中缀用法的函数: let f a b = (a+10, b) f 4 5 => (14,5) 4 `f` 5 => (14,5) 可以通过定义辅助函数来翻转参数: let g = flip
我正在以下 URL 中创建一个“艺术家表”:http://beta2.thrivemusic.com/artists/ 如您所见,如果将鼠标悬停在艺术家上方,会出现 3 个社交图标。但是,不同的浏
我想编写一个程序来“反射(reflect)”y 轴上的一串括号。例如,((()( 将变为 )()))。我知道可以这样做: s = '((()(' par = '(', ')' result = ''.
我想让一段文字“翻起来”,就好像它躺在 table 上然后又升起来一样。我的直接问题是 transform-origin - 我无法将文本的轴心点更改为“底部”。 0% {transform:pers
假设我们有一个由 0 和 1 组成的 m x n 网格,我们想要转换网格,使最大行数仅由 1 组成。我们被允许在网格上执行的唯一操作是选择一些列并翻转该列中的所有 0 和 1。我们还得到一些整数 k
我正在使用相当简单的 CSS 过渡来创建一个框,该框通过同时将两个 div 过渡 180 度来“翻转”。当您在盒子的“背面”时,它应该是稍微透明的,以便您可以看到底部。 除了最新的 Safari 7
numpy.flip(m, axis=None) Reverse the order of elements in an array along the given axis. The
我是编程初学者,我正在尝试使用 React 中的 FLIP 技术构建页面布局,但我卡住了,所以我想寻求您的帮助。有关 FLIP 技术的更多信息,请参阅引用 URL。 很快,我想构建一个页面布局,它由一
我最近看到一个面试问题,问以下问题: Given a 32 bit number, write pseudo code to flip the second last bit 最好/最简单的方法是什么
Prelude 的类型功能 flip是: flip :: (a -> b -> c) -> b -> a -> c 即,它需要一个二进制函数和两个参数。 Prelude 的类型功能 id是: id :
在 Haskell 中,我们有一个 flip功能:flip f x y = f y x ,它本质上接受一个函数并返回相同的函数,只是交换了两个参数。我想知道 OCaml 中是否有对应的,因为我找不到并
我有一个 UIView 用于绘制一组项目中的任何一个。也就是说,我的一个 UIView 子类可以被告知绘制一个正方形、圆形或三角形。 我想要一个过渡来翻转该 View ,以便 UIView 在中间点绘
我正在使用jquery插件jquery Flip https://nnattawat.github.io/flip/在我的网页中创建一个卡片翻转系统。该文档指定了一种从元素取消注册翻转事件的方法,我已
在 System.Console.GetOpt 文档中给出的第二个示例(在此处复制)中,我无法理解或解压此行: (o,n,[] ) -> return (foldl (flip id) defaul
这个问题在这里已经有了答案: Why does Haskell's "flip id" has this type? (1 个回答) 6年前关闭。 为什么是 flip id接受为有效表达?它不应该在
查看 ($) 和 flip 的类型: ghci> :t ($) ($) :: (a -> b) -> a -> b ghci> :t flip flip :: (a -> b -> c) -> b -
我非常清楚什么时候 ByteBuffer 需要翻转。我的问题是在 put-er 和 get-er 之间建立隐式契约以减少错误。 在将缓冲区提供给 setter/getter 之前,推杆是否会翻转?或者
我是一名优秀的程序员,十分优秀!