为了账号安全,请及时绑定邮箱和手机立即绑定

带有嵌入式导航控制器的Popover不考虑后导航的大小

带有嵌入式导航控制器的Popover不考虑后导航的大小

iOS
莫回无 2019-11-25 10:51:03
我有一个托管UINavigationController的UIPopoverController,其中包含一个小的层次的视图控制器。我遵循了文档,并为每个视图控制器设置了视图的popover-context大小,如下所示:[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];(每个控制器的大小不同)当我在层次结构中向前导航时,这可以按预期工作-弹出窗口会自动为尺寸更改设置动画效果,以与推送的控制器相对应。但是,当我通过导航栏的“后退”按钮在视图堆栈中导航“后退”时,弹出窗口不会改变大小,它的大小与到达的最深视图一样大。这对我来说似乎很糟;我希望弹出窗口在通过视图堆栈弹出时会尊重设置的大小。我想念什么吗?
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

这是我为iOS 7和8解决的方法:


在iOS 8中,iOS会将您在弹出窗口中所需的视图无提示地包装到presentingViewController视图控制器的presentedViewController中。有一个2014年的WWDC视频,解释了popovercontroller的新功能。


无论如何,对于在导航控制器堆栈上显示的视图控制器,它们都希望自己调整大小,这些视图控制器需要(在iOS 8下)调用此代码来动态设置preferredContentSize:


self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);

用您计算出的表或视图高度替换heightOfTable。


为了避免大量重复代码并创建常见的iOS 7和iOS 8解决方案,我在UITableViewController上创建了一个类别,以在tableviews中调用viewDidAppear时执行此工作:


- (void)viewDidAppear:(BOOL)animated 

{

    [super viewDidAppear:animated];

    [self setPopOverViewContentSize];

}

Category.h:


#import <UIKit/UIKit.h>


@interface UITableViewController (PreferredContentSize)


- (void) setPopOverViewContentSize;


@end

Category.m:


#import "Category.h"


@implementation UITableViewController (PreferredContentSize)


- (void) setPopOverViewContentSize

{

    [self.tableView layoutIfNeeded];

    int heightOfTable = [self.tableView contentSize].height;


    if (heightOfTable > 600)

        heightOfTable = 600;


    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

        if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)

            self.preferredContentSize=CGSizeMake(320, heightOfTable);

        else

            self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);

    }

}


@end


查看完整回答
反对 回复 2019-11-25
?
SMILET

TA贡献1796条经验 获得超4个赞

这是对krasnyk答案的改进。

您的解决方案很棒,但动画效果不佳。

进行一些改进可以使动画效果更好:


删除- (void) forcePopoverSize方法中的最后一行:


- (void) forcePopoverSize {

    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;

    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);

    self.contentSizeForViewInPopover = fakeMomentarySize;

}

将[self forcePopoverSize]放在- (void)viewWillAppear:(BOOL)animated方法中:


- (void)viewWillAppear:(BOOL)animated

{

    [super viewWillAppear:animated];


    [self forcePopoverSize];

}

最后-在- (void)viewDidAppear:(BOOL)animated方法中设置所需的大小:


- (void)viewDidAppear:(BOOL)animated

{

    [super viewDidAppear:animated];


    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;

    self.contentSizeForViewInPopover = currentSetSizeForPopover;

}

分享编辑


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 541 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信