斯威夫特 - 类型 'CircularTransition' 不符合协议 'UIViewControllerAnimatedTransitioning'
问题描述:
class CircularTransition: NSObject {
var circle = UIView()
var startingPoint = CGPoint.zero {
didSet {
circle.center = startingPoint
}
}
var circleColor = UIColor.whiteColor()
var duration = 0.3
enum CircularTransitionMode:Int {
case present, dismiss, pop
}
var transitionMode:CircularTransitionMode = .present
}
extension CircularTransition:UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return duration
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView
if transitionMode == .present {
if let presentedView = transitionContext.viewForKey(UITransitionContextToViewControllerKey) {
let viewCenter = presentedView.center
let viewSize = presentedView.frame.size
circle = UIView()
circle.frame = frameForCircle(withViewCenter: viewCenter, size: viewSize, startPoint: startingPoint)
circle.layer.cornerRadius = circle.frame.size.height/2
circle.center = startingPoint
circle.backgroundColor = circleColor
circle.transform = CGAffineTransformMakeScale(0.001, 0.001)
containerView()!.addSubview(circle)
presentedView.center = startingPoint
presentedView.transform = CGAffineTransformMakeScale(0.001, 0.001)
presentedView.alpha = 0
containerView()!.addSubview(presentedView)
UIView.animateWithDuration(duration, animations: {
self.circle.transform = CGAffineTransformIdentity
presentedView.transform = CGAffineTransformIdentity
presentedView.alpha = 1
presentedView.center = viewCenter
}, completion: { (success:Bool) in
transitionContext.completeTransition(success)
})
}
} else {
let transitionModeKey = (transitionMode == .pop) ? UITransitionContextToViewKey : UITransitionContextFromViewKey
if let returningView = transitionContext.viewForKey(transitionModeKey) {
let viewCenter = returningView.center
let viewSize = returningView.frame.size
circle.frame = frameForCircle(withViewCenter: viewCenter, size: viewSize, startPoint: startingPoint)
circle.layer.cornerRadius = circle.frame.size.height/2
circle.center = startingPoint
UIView.animateWithDuration(duration, animations: {
self.circle.transform = CGAffineTransformMakeScale(0.001, 0.001)
returningView.transform = CGAffineTransformMakeScale(0.001, 0.001)
returningView.center = self.startingPoint
returningView.alpha = 0
if self.transitionMode == .pop {
containerView()!.insertSubview(returningView, belowSubview: returningView)
containerView()!.insertSubview(self.circle, belowSubview: returningView)
}
}, completion: { (success:Bool) in
returningView.center = viewCenter
returningView.removeFromSuperview()
self.circle.removeFromSuperview()
transitionContext.completeTransition(success)
})
}
}
}
func frameForCircle (withViewCenter viewCenter:CGPoint, size viewSize:CGSize, startPoint:CGPoint) -> CGRect {
let xLength = fmax(startPoint.x, viewSize.width - startPoint.x)
let yLength = fmax(startPoint.y, viewSize.height - startPoint.y)
let offestVector = sqrt(xLength * xLength + yLength * yLength) * 2
let size = CGSize(width: offestVector, height: offestVector)
return CGRect(origin: CGPoint.zero, size: size)
}
}
错误: “类型 'CircularTransition' 不符合协议 'UIViewControllerAnimatedTransitioning'”斯威夫特 - 类型 'CircularTransition' 不符合协议 'UIViewControllerAnimatedTransitioning'
我试图按照YouTube的教程(链接波纹),问题是他正在使用Swift 3,但我不是。
这里是在视频中使用的代码。
整个代码,但在迅疾3:https://github.com/brianadvent/CircularTransition/tree/master/CircularTransitionft
答
我解决它。
我简单地更换以下,
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
与
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
和
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
与
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
干得好,并感谢您发布全面的答案。只要系统允许,你应该接受你自己的答案。 –
但真正的问题是,你正在使用Swift 2.对Swift 2的支持正在消失。更新会更好。 – matt
我知道,稍后会做 – Victor