Ios UIPopoverController在更改内容大小时减慢动画速度

Ios UIPopoverController在更改内容大小时减慢动画速度,ios,ipad,animation,uipopovercontroller,Ios,Ipad,Animation,Uipopovercontroller,我有一个UIPopoverController,我在其中按下一个UiNavigationController,然后根据需要按下后续的视图控制器。如果所有视图的首选内容大小都相同,那么这非常有效,但是当UIPopOver需要扩展以支持更大的首选内容大小时,动画速度会非常慢。我已经在模拟器和多代iPad上进行了测试,结果都是一样的,一个2-3秒的动画,而UIPover扩展视图以支持更大的视图控制器 如何加速此动画 OTBAddNewClassViewController *addVC = [

我有一个UIPopoverController,我在其中按下一个UiNavigationController,然后根据需要按下后续的视图控制器。如果所有视图的首选内容大小都相同,那么这非常有效,但是当UIPopOver需要扩展以支持更大的首选内容大小时,动画速度会非常慢。我已经在模拟器和多代iPad上进行了测试,结果都是一样的,一个2-3秒的动画,而UIPover扩展视图以支持更大的视图控制器

如何加速此动画

    OTBAddNewClassViewController *addVC = [[OTBAddNewClassViewController alloc]initWithNibName:@"addNewClass" bundle:nil];
    [addVC setPreferredContentSize:CGSizeMake(320, 220)];
    [addVC setDelegate:self];
    UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:addVC];
    self.popVC = [[UIPopoverController alloc]initWithContentViewController:navController];
    [self.popVC setDelegate:self];

    NSInteger popWidth = addVC.view.frame.size.width;
    [self.popVC presentPopoverFromRect:CGRectMake(0, 0, popWidth, addVC.view.frame.size.height) inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

您需要设置
UINavigationController
委托,然后覆盖
navigationController:willShowViewController:animated:
,并执行以下操作:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    CGSize contentSize = viewController.preferredContentSize;
    [self.popVC setPopoverContentSize:contentSize animated:YES];
}

更新答案:

要更改UIPopoverController设置其contentSize动画的速度,请尝试以下操作:

[UIView animateWithDuration:1.0  // Set your desired duration here
                          delay:0.0
                        options: UIViewAnimationCurveEaseOut
                     animations:^{
                         [popoverController setPopoverContentSize:CGSizeMake(width, height)];
                     }
                     completion:^(BOOL finished){

                     }];
原始答案:

如果我没有记错,您有一个UIPopoverController,它包含一个UIAvigationController,可以在popoverController内部推/弹出其他viewController,并且您希望popoverController根据推/弹出viewController中视图的大小动态重新调整大小

我已经在iPad应用程序中实现了类似的功能,我使用了以下方法:

在popoverController中包含的viewController中,我使用ContentSizeForPover属性在ViewDidDisplay中重新调整popover的大小:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    self.contentSizeForViewInPopover = CGSizeMake(320, 280); // Set your size here.
}
但是,值得注意的是,contentSizeForViewInPopover在iOS 7中已被弃用,您最终必须更新代码,让popoverController使用setPopoverContentSize更新高度:

    [popoverController setPopoverContentSize:CGSizeMake(320, 280)];
在我的应用程序中,我必须通过设置一个协议将预期的高度传递回UIPopoverController来实现这一点。我使用以下代码执行此操作:

议定书:

@protocol MyProtocolName <NSObject>

- (void)setPopOverContentSize:(CGSize)size;
类包含符合我创建的协议的popoverController:

- (void)setPopOverContentSize:(CGSize)size {
    UINavigationController* navController = (UINavigationController *)self.appPopOver.contentViewController;

    UIViewController* currentViewController = navController.topViewController;
    [myPopoverController setPopoverContentSize:size];
}
您需要自定义我为您的特定类发布的代码片段,但我尝试提供与实现您想要的效果相同的过程


我希望这有帮助

你是在使用NIB、故事板还是通过编程来实现它?有两点——UIPopoverController通常不会被推到导航堆栈上,所以我不知道你说的是什么意思,你说你要把它推到导航控制器上。此外,如果不发布您尝试执行的操作的代码,我们也无法提供太多帮助。您确定没有任何性能问题吗?并且没有锁定主线程?这似乎是正确的答案。它比我提供的要简单得多,避免使用不推荐使用的属性,并使用viewController的preferredContentSize而不是CGSizeMake+1请参阅我对Aron回答的评论,不是关于popover没有扩展以满足新视图控制器的大小,而是关于该动画的速度有多慢。我觉得奇怪的是,您的动画仍然很慢。你在用小牛吗?如果是这样的话,如果你在iOS 6模拟器中运行这个程序,它会很慢。这是一个众所周知的问题。另外,你确定你没有在模拟器中“切换慢速动画”吗?在模拟器和iPad2上都很慢。popover会动态增长以匹配新推的view controller的大小,这不是问题所在。问题是动画制作需要多长时间,大约2秒,这会造成一种真正脱节的体验。在动画块中包装动画对性能没有影响。你在哪里调用上面发布的代码?我刚刚注意到你说改变大小需要2-3秒,所以动画块无法工作,因为可能还有其他事情发生。你可以发布更多的代码来告诉我们你是如何调用上面的代码的吗?
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    ....

    [self.delegate setPopOverContentSize:CGSizeMake(320, 280)];
}
- (void)setPopOverContentSize:(CGSize)size {
    UINavigationController* navController = (UINavigationController *)self.appPopOver.contentViewController;

    UIViewController* currentViewController = navController.topViewController;
    [myPopoverController setPopoverContentSize:size];
}