我有一个带有子类UINavigationController的UIPopoverController。父视图和子视图都是UITableviews。
当我最初使用contentSizeForViewInPopover =(320,480)调用父视图时,效果很好。
当我点击子视图时,我将popover的大小调整为contentSizeForViewInPopover =(320,780)
当返回到父视图时,我无法让popover重新调整为contentSizeForViewInPopover =(320,480)。 popover保持在(320,780)大小。
尝试了一切,但只是遗漏了一些东西。在上面的场景中,任何人都知道如何使用UIPopoverControllers调整视图大小?
先谢谢!!
答案 0 :(得分:24)
视图控制器的contentSizeForViewInPopover
属性仅设置其包含UIPopoverController
的默认(初始)大小。要在任意时间调整UIPopoverController
的大小,您必须设置其popoverContentSize属性。请注意,popoverContentSize
是视图控制器的UIPopoverController
和不的属性(因此您可能需要对弹出控制器的引用)。
要在每次视图控制器成为UINavigationController
的顶视图控制器时重置弹出框的大小,您可以使用UINavigationControllerDelegate
协议方法:
navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (viewController == viewControllerToResize) {
referenceToUIPopoverController.popoverContentSize = CGSizeMake(320,480);
}
}
答案 1 :(得分:13)
我遇到了同样的问题,但上述解决方案都没有对我有用。然而,在尝试结合他们的方法时,我受到启发,尝试以稍微不同的方式来解决问题。这对我有用:
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
viewController.contentSizeForViewInPopover = navigationController.topViewController.view.frame.size;
}
我有三个不同的弹出窗口,每个弹出窗口都使用导航视图控制器。这个解决方案具有很好的副作用,因为它不会对任何弹出控制器进行特定的引用,但最终会使用当前正在使用的弹出控制器中的popoverContentSize。
答案 2 :(得分:2)
在我的项目中,我必须动态地改变弹出窗口的大小。
我创建了popover内容控制器的原始控制器委托,并实现了每次更改大小时调用的委托方法:
代码如下:希望它有助于某人:
-(void) popover:(UIViewController*)controller didChangeSize:(CGSize)size{
if ([controller class] == [AZViewController class]){
if (!_popoverController){
_popoverController = [[UIPopoverController alloc] initWithContentViewController:controller];
}
_popoverController.popoverContentSize = size;
}
}
答案 3 :(得分:1)
我认为我遇到了同样的问题,每次视图即将出现时,我都会通过在popover中设置视图的大小来解决它。像这样:
-(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; self.contentSizeForViewInPopover = CGSizeMake(320, 444); //Set your own size }
我希望这会对你有所帮助。
答案 4 :(得分:1)
我想我可能已经想到了这一点,因为我现在已经讨论了这个问题了一段时间。可能会有点乐观,所以如果这个解决方案不适合你,请随时评论。
在使用导航层次结构显示的每个viewController中,将viewDidAppear:方法中的contentSizeForViewInPopover属性设置为适当的大小。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self setContentSizeForViewInPopover:CGSizeMake(320, 320)];
}
我选择的另一件事是,在编辑textField时回击时,尺寸保持较小而不是较大的先前视图。在控制器的viewWillDisappear中调用textField上的resignFirstResponder方法。
我很好奇这个解决方案是否适用于sdks。
答案 5 :(得分:0)
在尝试了很多东西之后,@ chuck-k的答案帮助我在iOS7中正确地解决了我的UINavigationController popover问题。
这就是我的所作所为:
对于UINavigationController中的每个UIViewController,我计算了我希望在方法- (CGSize)contentSizeForViewInPopover
加navigationController.navigationBar.frame.size.height
中显示的内容大小(我认为总是44)。我在这些UIViewControllers中没有使用任何其他popover功能。
我宣布我的UIViewController创建UINavigationController为UINavigationControllerDelegate
然后在代表....
.....
- (void)navigationController:(UINavigationController *)navigationController willShowViewController: (UIViewController *)viewController animated:(BOOL)animated {
BOOL popoverAnimation = NO;
if ( self.myPopoverController.popoverContentSize.height < viewController.contentSizeForViewInPopover.height ) popoverAnimation = YES;
[self.myPopoverController setPopoverContentSize:viewController.contentSizeForViewInPopover animated:popoverAnimation];
}
高度检查将当前视图控制器的弹出窗口内容大小与“传入”视图控制器弹出窗口内容大小进行比较。从更大的时候我使用 animation = NO - &gt;较小的 popover内容大小,因为否则我会在iOS7中获得一些生涩的重新定位动画。但特别是当动画=否时,从较小 - >&gt;较大的弹出窗口内容大小, popover 大小将增加到我预期的但不会显示内容的大小较小的内容大小...设置动画=是为我解决了这个问题。 (我只检查高度,因为在我的情况下,宽度是固定的。)
通过使用这种技术,几乎所有的东西终于让我满意,我希望这可以帮助别人。