- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我开始着手创建自定义插入/弹出转换,第一次插入转换时一切正常,但是当我尝试插入另一个 View Controller 时,我根本看不到任何动画。
Here is a sample project with the code
大量代码传入:
这是我的 UINavigationControllerDelegate 类:
@interface CKMNavigationControllerDelegate : NSObject <UINavigationControllerDelegate>
- (instancetype)initWithForwardTransitionObject:(id<UIViewControllerAnimatedTransitioning>)inForwardTransitionObject popTransitionObject:(id<UIViewControllerAnimatedTransitioning>)inBackTransitionObject;
@property(nonatomic, strong) id<UIViewControllerAnimatedTransitioning> forwardTransitionObject;
@property(nonatomic, strong) id<UIViewControllerAnimatedTransitioning> backTransitionObject;
@end
@implementation CKMNavigationControllerDelegate
- (instancetype)initWithForwardTransitionObject:(id<UIViewControllerAnimatedTransitioning>)inForwardTransitionObject popTransitionObject:(id<UIViewControllerAnimatedTransitioning>)inBackTransitionObject
{
NSAssert( [inForwardTransitionObject conformsToProtocol:@protocol(UIViewControllerAnimatedTransitioning)], @"inForwardTransitionObject does not conform to protocol UIViewControllerAnimatedTransitioning" );
NSAssert( [inBackTransitionObject conformsToProtocol:@protocol(UIViewControllerAnimatedTransitioning)], @"inBackTransitionObject does not conform to protocol UIViewControllerAnimatedTransitioning" );
self = [super init];
if( !self ) return nil;
_forwardTransitionObject = inForwardTransitionObject;
_backTransitionObject = inBackTransitionObject;
return self;
}
- (void)setForwardTransitionObject:(id<UIViewControllerAnimatedTransitioning>)inForwardTransitionObject
{
NSAssert( [inForwardTransitionObject conformsToProtocol:@protocol(UIViewControllerAnimatedTransitioning)], @"inForwardTransitionObject does not conform to protocol UIViewControllerAnimatedTransitioning" );
_forwardTransitionObject = inForwardTransitionObject;
}
- (void)setBackTransitionObject:(id<UIViewControllerAnimatedTransitioning>)inBackTransitionObject
{
NSAssert( [inBackTransitionObject conformsToProtocol:@protocol(UIViewControllerAnimatedTransitioning)], @"inBackTransitionObject does not conform to protocol UIViewControllerAnimatedTransitioning" );
_backTransitionObject = inBackTransitionObject;
}
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)inNavigationController animationControllerForOperation:(UINavigationControllerOperation)inOperation fromViewController:(UIViewController *)inFroViewController toViewController:(UIViewController *)inToViewController
{
return inOperation == UINavigationControllerOperationPush ? self.forwardTransitionObject : self.backTransitionObject;
}
为推送转换实现 UIViewControllerAnimatedTransitioning 的类:
@interface CKMForwardTransitionObject : NSObject <UIViewControllerAnimatedTransitioning>
@end
@implementation CKMForwardTransitionObject
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext {
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
NSAssert([toViewController conformsToProtocol:@protocol(CKMTransitionAnimatable)], @"toViewController does not conform to CKMTransitionAnimatable");
NSAssert([fromViewController conformsToProtocol:@protocol(CKMTransitionAnimatable)], @"fromViewController does not conform to CKMTransitionAnimatable");
id <CKMTransitionAnimatable> fromAnimationSource = (id <CKMTransitionAnimatable>)fromViewController;
id <CKMTransitionAnimatable> toAnimationSource = (id <CKMTransitionAnimatable>)toViewController;
CGFloat duration = [fromAnimationSource transitionOutDuration] + [toAnimationSource transitionInDuration];
return duration;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
NSAssert([toViewController conformsToProtocol:@protocol(CKMTransitionAnimatable)], @"toViewController does not conform to CKMTransitionAnimatable");
NSAssert([fromViewController conformsToProtocol:@protocol(CKMTransitionAnimatable)], @"fromViewController does not conform to CKMTransitionAnimatable");
UIView *containerView = [transitionContext containerView];
[containerView addSubview:toViewController.view];
[containerView addSubview:fromViewController.view];
id <CKMTransitionAnimatable> fromAnimationSource = (id <CKMTransitionAnimatable>)fromViewController;
id <CKMTransitionAnimatable> toAnimationSource = (id <CKMTransitionAnimatable>)toViewController;
CGFloat animationDelay = [fromAnimationSource transitionOutDuration];
[fromAnimationSource animateOnTransitionOut:nil];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(animationDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[toAnimationSource animateOnTransitionIn:^{
[transitionContext completeTransition:YES];
}];
});
}
使用自定义转换的 ViewControllers 将实现我的协议(protocol):
typedef void (^CKMAnimationCompletionBlock)(void);
@protocol CKMTransitionAnimatable <NSObject>
- (void)animateOnTransitionIn:(CKMAnimationCompletionBlock)inAnimationCompletionBlock;
- (void)animateOnTransitionOut:(CKMAnimationCompletionBlock)inAnimationCompletionBlock;
- (NSTimeInterval)transitionInDuration;
- (NSTimeInterval)transitionOutDuration;
@end
最后是 View Controller 中实际实现 CKMTransitionAnimatable 协议(protocol)的代码:
- (NSTimeInterval)transitionInDuration
{
return 0.4;
}
- (NSTimeInterval)transitionOutDuration
{
return 0.4;
}
- (void)animateOnTransitionOut:(CKMAnimationCompletionBlock)inAnimationCompletionBlock
{
[UIView animateWithDuration:[self transitionOutDuration] animations:^{
self.contentView.alpha = 0;
} completion:^(BOOL finished) {
if( inAnimationCompletionBlock )
{
inAnimationCompletionBlock();
}
}];
}
- (void)animateOnTransitionIn:(CKMAnimationCompletionBlock)inAnimationCompletionBlock
{
[UIView animateWithDuration:[self transitionInDuration] animations:^{
self.contentView.alpha = 1;
} completion:^(BOOL finished) {
if( inAnimationCompletionBlock )
{
inAnimationCompletionBlock();
}
}];
}
一切看起来都很简单,但就我的生活而言,我看不出我做错了什么。
最佳答案
解决了问题...看起来这是我在 animateTransition 中将 View Controller 添加到容器 View 的方式。它应该看起来像这样:
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
NSAssert([toViewController conformsToProtocol:@protocol(CKMTransitionAnimatable)], @"toViewController does not conform to CKMTransitionAnimatable");
NSAssert([fromViewController conformsToProtocol:@protocol(CKMTransitionAnimatable)], @"fromViewController does not conform to CKMTransitionAnimatable");
UIView *containerView = [transitionContext containerView];
[containerView addSubview:fromViewController.view];
id <CKMTransitionAnimatable> fromAnimationSource = (id <CKMTransitionAnimatable>)fromViewController;
id <CKMTransitionAnimatable> toAnimationSource = (id <CKMTransitionAnimatable>)toViewController;
[fromAnimationSource animateOnTransitionOut:nil];
CGFloat animationDelay = [fromAnimationSource transitionOutDuration];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(animationDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[containerView addSubview:toViewController.view];
[toAnimationSource animateOnTransitionIn:^{
[transitionContext completeTransition:YES];
}];
});
}
关于ios - UINavigationControllerDelegate 和 UIViewControllerAnimatedTransitioning 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31462543/
我已经建立了一个非常简单的项目,没有 Storyboard,一个窗口和一个 UINavigationController,其中包含一个普通的旧 UIViewController 作为 rootView
UINavigationControllerDelegate 只有 2 个委托(delegate)方法可以使用: navigationController:willShowViewController
更新到正确的版本,因为得到了答案。 我想在导航 View Controller 弹出/推送时做淡入/淡出动画,然后我实现一个 BaseViewController: class BaseViewCon
我的代码: 导航器.m - (void)newPushPage:(UIViewController *)controller { [self pushViewController:contro
我有一个 View Controller ,在其中实现 UIImagePickerDelegate 和 UINavigationControllerDelegate,以便从图库或相机获取图像。选择图像
我想为 UINavigation Controller 实现自定义动画。 我在 Appdelegate 中添加了一些属性: @interface MyAppDelegate : UIResponder
我正在尝试在从自定义 UINavigationController 类推送/弹出 viewController 时进行自定义转换。我正在实现 UINavigationControllerDelegat
我在 UINavigationController 堆栈中有一个用于推送和弹出事件的自定义动画转换,我只想将该自定义动画应用于特定的推送事件——例如,在推送 RandomViewController4
答案:简单语法错误 - 设置委托(delegate)时,它应该读取 SomeNavigationController.delegate = self,而不是 SomeNavigationControl
所以我开始着手创建自定义插入/弹出转换,第一次插入转换时一切正常,但是当我尝试插入另一个 View Controller 时,我根本看不到任何动画。 Here is a sample project
(XCode 8.1,Swift 3。github 中的示例 https://github.com/SuperTango/UINavigationControllerNoNavbar 在“byhand
短:实现 func navigationController(_ navigationController: UINavigationController, animationControllerFo
我正在尝试使用 UIImagePickerController 从图库中挑选一张图片。 如果我的 View Controller 没有提到 UINavigationControllerDelegate
class ViewController: UIViewController, UINavigationControllerDelegate { override func viewDid
有没有办法让 View Controller 从内部转换出来: - (void)navigationController:(UINavigationController *)navigationCon
DetailViewController MasterViewController ViewController 目前,我通过让 ViewController 类中的一个变量指向 DetailVi
func openGallery(sender: AnyObject) { var imagePicker = UIImagePickerController() imagePicke
我正在开发一个包含 WYPopoverController 的应用程序,它在应有的地方工作得很好。我想在两个 Controller 之间添加自定义动画,而不是内置 push/pop。 在包含 FROM
如果您拖动 UIViewController 的边缘以在 UINavigationController 中开始交互式弹出转换,当前下方的 UIViewController 具有 viewWillApp
弹出到不支持当前方向的 View Controller 时,未调用 UINavigationControllerDelegate 方法。 我有一个 UINavigationController 作为我
我是一名优秀的程序员,十分优秀!