- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,不可能将 View Controller 动画用作 Segue 过渡。目前,我在现有项目中有一组 View Controller 动画,可在 View Controller 之间创建动画转换。例如:
模态动画.h文件:
//
// MVModalDismissAnimation.h
//
#import "MVBaseAnimation.h"
@interface MVModalAnimation : MVBaseAnimation
@end
模态动画.m文件:
//
// MVModalDismissAnimation.m
//
#import "MVModalAnimation.h"
@implementation MVModalAnimation {
UIView *_coverView;
NSArray *_constraints;
}
#pragma mark - Animated Transitioning
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
//The view controller's view that is presenting the modal view
UIView *containerView = [transitionContext containerView];
if (self.type == AnimationTypePresent) {
//The modal view itself
UIView *modalView = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey].view;
//View to darken the area behind the modal view
if (!_coverView) {
_coverView = [[UIView alloc] initWithFrame:containerView.frame];
_coverView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.6];
_coverView.alpha = 0.0;
} else _coverView.frame = containerView.frame;
[containerView addSubview:_coverView];
//Using autolayout to position the modal view
modalView.translatesAutoresizingMaskIntoConstraints = NO;
[containerView addSubview:modalView];
NSDictionary *views = NSDictionaryOfVariableBindings(containerView, modalView);
_constraints = [[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[modalView]-30-|" options:0 metrics:nil views:views] arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[modalView]-30-|" options:0 metrics:nil views:views]];
[containerView addConstraints:_constraints];
//Move off of the screen so we can slide it up
CGRect endFrame = modalView.frame;
modalView.frame = CGRectMake(endFrame.origin.x, containerView.frame.size.height, endFrame.size.width, endFrame.size.height);
[containerView bringSubviewToFront:modalView];
//Animate using spring animation
[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 usingSpringWithDamping:0.8 initialSpringVelocity:1.0 options:0 animations:^{
modalView.frame = endFrame;
_coverView.alpha = 1.0;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
} else if (self.type == AnimationTypeDismiss) {
//The modal view itself
UIView *modalView = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey].view;
//Grab a snapshot of the modal view for animating
UIView *snapshot = [modalView snapshotViewAfterScreenUpdates:NO];
snapshot.frame = modalView.frame;
[containerView addSubview:snapshot];
[containerView bringSubviewToFront:snapshot];
[modalView removeFromSuperview];
//Set the snapshot's anchor point for CG transform
CGRect originalFrame = snapshot.frame;
snapshot.layer.anchorPoint = CGPointMake(0.0, 1.0);
snapshot.frame = originalFrame;
//Animate using keyframe animation
[UIView animateKeyframesWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:0 animations:^{
[UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.15 animations:^{
//90 degrees (clockwise)
snapshot.transform = CGAffineTransformMakeRotation(M_PI * -1.5);
}];
[UIView addKeyframeWithRelativeStartTime:0.15 relativeDuration:0.10 animations:^{
//180 degrees
snapshot.transform = CGAffineTransformMakeRotation(M_PI * 1.0);
}];
[UIView addKeyframeWithRelativeStartTime:0.25 relativeDuration:0.20 animations:^{
//Swing past, ~225 degrees
snapshot.transform = CGAffineTransformMakeRotation(M_PI * 1.3);
}];
[UIView addKeyframeWithRelativeStartTime:0.45 relativeDuration:0.20 animations:^{
//Swing back, ~140 degrees
snapshot.transform = CGAffineTransformMakeRotation(M_PI * 0.8);
}];
[UIView addKeyframeWithRelativeStartTime:0.65 relativeDuration:0.35 animations:^{
//Spin and fall off the corner
//Fade out the cover view since it is the last step
CGAffineTransform shift = CGAffineTransformMakeTranslation(180.0, 0.0);
CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI * 0.3);
snapshot.transform = CGAffineTransformConcat(shift, rotate);
_coverView.alpha = 0.0;
}];
} completion:^(BOOL finished) {
[_coverView removeFromSuperview];
[containerView removeConstraints:_constraints];
[transitionContext completeTransition:YES];
}];
}
}
-(NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
if (self.type == AnimationTypePresent) return 1.0;
else if (self.type == AnimationTypeDismiss) return 1.75;
else return [super transitionDuration:transitionContext];
}
@end
上面从底部向上滑动模态视图 Controller 。
我现在想将其转换为与 Storyboard和 segues 一起使用。
我有四种其他类型的动画要转换,那么有没有一种直接的方法可以使上述类与 segue 过渡一起工作?
最佳答案
我可能误会了你,但这是一个与自定义转场一起使用的转场示例...
@interface TestSegue : UIStoryboardSegue
@end
@implementation TestSegue
-(void)perform
{
UIView *sv = ((UIViewController *)self.sourceViewController).view;
UIView *dv = ((UIViewController *)self.destinationViewController).view;
UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
[window insertSubview:dv aboveSubview:sv];
[dv enterRight:0.1 then:^
{
[self.sourceViewController
presentViewController:self.destinationViewController
animated:NO completion:nil];
}];
}
@end
注意我的例程“enterRight:”只是 UIView 上的一个类别
使用自定义 segues 的便捷教程 ... http://www.bencz.com/hacks/2014/02/07/custom-ios-segues-in-xcode-5/
我的类别在 UIView 上的一个示例,它只是 View 的移动动画...
请注意您需要并且必须有一个“after” block ,以便能够在自定义 segue 中使用它。
注意 - 这里有关于将 block 作为属性的完整解释,供不熟悉该 block 的阅读者使用 https://stackoverflow.com/a/20760583/294884
-(void)enterRight:(float)delay then:(void(^)(void))after
{
CGPoint moveTo = self.center;
CGPoint moveFrom = self.center;
CGFloat simpleOffscreen = [UIScreen mainScreen].bounds.size.width;
moveFrom.x = moveFrom.x + simpleOffscreen;
self.center = moveFrom;
self.hidden = NO;
[UIView animateWithDuration:0.5
delay:delay
usingSpringWithDamping:0.4
initialSpringVelocity:0.1
options:0
animations:^
{
self.center = moveTo;
}
completion:^(BOOL finished)
{
if (after) after();
}
];
}
在 Xcode 中单击以添加新文件,然后选择类别。有两个盒子。
因此,一个类别在某个类别“之上”。在这种情况下,它是“在”UIView 上。在底部框中,输入 UIView。
在顶部的框中,简单地输入一些方便的、简短的名称。事实上,使用的名称并不重要。例如,典型的选择是“Utility”“Helpers”“Tricks”“Anime”或类似的。
现在转到 .h 文件并添加这个
-(void)enterRight:(float)delay then:(void(^)(void))after;
现在转到 .m 文件并准确添加上面的函数。您现在可以在代码中的任何位置使用该函数。这是一个使用它的例子
-(void)viewDidLoad
{
[super viewDidLoad];
[PFAnalytics trackEvent:@"harvestFBPage"];
[self.slideOff showMessage:@"Next step..."];
[self.slideOff enterRight:0.0 then:nil];
}
因此,对于任何 UIView,您都可以转到 [anyUIView enterRight...];
这很棒。在示例中,self.slideOff 是一个 UIView。
请注意,在该示例中,“之后无事可做”。这是一个“之后要做的事情”的示例。
-(void)viewDidLoad
{
[super viewDidLoad];
[PFAnalytics trackEvent:@"harvestFBPage"];
[self.slideOff showMessage:@"Next step..."];
[self.slideOff enterRight:0.0 then:^
{
NSLog(@"do this afterwards!");
self.slideOff.alpha = 0.5;
etc;
etc;
}];
}
希望对类别有所帮助。不要忘记去这里https://stackoverflow.com/a/20760583/294884如果您不太熟悉 block 作为参数。
回到手头的问题。
在自定义转场中不可能使用任何类型的动画,除非它包含“完成后运行此 block ”的概念,因为您必须消息 presentViewController: (with animated:NO) only when you are finished.
假设我已经理解您的问题,这就是关键。
关于uistoryboard - 如何将 View Controller 动画过渡转换为 Segue 动画过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19755208/
我一整天都遇到同样的错误,我知道这是在说 Storyboard 中没有识别出 segue,但确实如此。以下是我认为相关的代码:1.为 segue 发出信号的按钮的 IBAction。 -(IBActi
我有一个从 A View Controller 到 B View Controller 的 unwind segue。 在B中做了一个网络操作,操作完成后,响应会显示在A View Controlle
我正在创建一个应用程序,家长可以在其中登录并查看有关其本地托儿中心的信息。但是,为登录运行 View Controller 的代码无法正常工作。一旦用户按下登录按钮,我希望我的代码使用标识符“Show
刚刚遇到一个奇怪的问题。我有一个启动画面,它自动使用自定义 segue (fade-to-segue) 转到主页 ViewController。自定义 segue 工作正常,但一旦实现,我在主页上的其
以编程方式创建的 segue 在 performSegueWithIdentifier: 上使应用程序崩溃,不过我真的不想使用 Storyboard。 - (void)viewDidLoad { [s
我想我一定在这里遗漏了一些简单的东西,但我不知道它是什么。 我必须支持来自同一个 View Controller 的多个 segue,所以我很自然地想使用 segue 标识符。我的代码由于某种原因无法
当用户在警告时点击“确定”按钮时,我如何才能将用户带到自定义 View Controller ? 我有一个主 Controller -> 导航 Controller -> 第二个 View Contr
在 TableView Controller 中,我试图获取在我继续之前选择的行的索引(最终将传递此信息以准备继续)。我已经实现了这个功能: var selectedQuestionCell: Ind
我正在 Xamarin Studio 中开发一个应用程序(所以它是 C#),它有一个包含多个 TextField 的表单,我想在 segue 之前验证整个屏幕> 到下一个屏幕执行。单击按钮时,它正在使
我有一个带有标识符的 segue。 当我按下函数 shouldPerformSegueWithIdentifier 中的按钮时,我得到一个空标识符 什么会导致这样的问题?我设置错了什么? 这是我的代码
我有一个奇怪的问题。我在 Storyboard中创建了 2 个 View Controller :testSegueViewcontroller 和 nextPageViewController。 t
我下面的代码试图将一个值从 twoviewcontroller 转移到 View Controller 。 segue 正在工作,我可以从 View Controller 转到 View Contro
我正在尝试使用自定义segue,当单击按钮时,它会使 View 向右或向左“滚动”。我添加了一个如下所示的自定义类 class horizontalSegue : UIStoryboardSegue
我有一个带有 Root View Controller 的 UINavigationController。我的 UINavigationController 也设置为我的应用程序的 Initial V
您好,我正在尝试使用 prepare for segue 方法执行一个 segue。我在关注这个问题 this但我无法成功注册。当我单击注册按钮时,它所做的只是注册用户并停在那里。我从 View Co
当 Storyboard上有一个按钮连接退出时,我了解如何使用展开转场。但是在我的应用程序中,我使用推送转场从 TableViewController 转到 ViewController。所以我的导航
我要实现的目标的背景: MainViewController 呈现 TableVC。我将点击一个单元格以显示 DetailVC。能够通过 TableVC 或 DetailVC 上导航栏上的 doneB
在我的 Storyboard中,模态转场将用户带到登录屏幕(从主屏幕)。然后,我从注册屏幕添加了一个 PUSH segue 到下一个屏幕(创建配置文件),该屏幕嵌入在导航 Controller 中(创
我有大约 6 个 segue 在 prepareForSegue 方法中执行相同的操作,但是,我想为我的 unwind segue 跳过此操作,但我无法弄清楚如何确定传递的 segue 是 unwin
因此,我开始在XCode 4.3.2中使用 Storyboard 。我从Master-Detail应用程序(iPad的拆分 View 应用程序)开始。在详细信息 View (名为DetailVC)中,
我是一名优秀的程序员,十分优秀!