了解使用 UIPopoverController 时的 UIScrollView 大小行为

Posted

技术标签:

【中文标题】了解使用 UIPopoverController 时的 UIScrollView 大小行为【英文标题】:Understanding UIScrollView size behavior when using UIPopoverController 【发布时间】:2013-05-11 10:15:44 【问题描述】:

我正在阅读一本关于 ios 开发的书,并且正在为 iPad 构建一个测试应用程序。我正在尝试在 iPad 上运行时创建一个弹出框,它显示 UIScrollView 显示用户可以滚动的 UIImage。

我遇到的问题是,当弹出框加载时,图像已被拉伸以完全适合弹出框的大小(使滚动既无用又不起作用)。

我无法弄清楚我的应用程序的行为。当用户单击 UITableView 上单元格内的 UIButton 时,我正在创建一个新的 UIPopoverController。

ItemsViewController.m

CGRect rect = [[self view] convertRect:[sender bounds] fromView:sender];
ImageViewController *ivc = [[ImageViewController alloc] init];
[ivc setImage:img]

// Present a popover from the rect
imagePopover = [[UIPopoverController alloc] initWithContentViewController:ivc];
[imagePopover setDelegate:self];
[imagePopover setPopoverContentSize:CGSizeMake(600.0, 600.0)];
[imagePopover presentPopoverFromRect: rect inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

我正在我的 ImageViewController 中以如下方式以编程方式创建 UIScrollView 和 UIImageView。

ImageViewController.m

- (id)init 
    if (self = [super init]) 
        scrollView = [[UIScrollView alloc] init];
        imageView = [[UIScrollView alloc] init];
    
    return self;

为了弄清楚为什么 scollView 会在屏幕上显示弹出框的时候重置它的大小,我创建了一个小方法来打印出 scrollView 框架的大小,即imageView 和 scrollView 的内容大小。

在 viewDidLoad 里面我设置了 imageView 图像(并调整了大小)。我还将 imageView 添加到 scrollView。

ImageViewController.m

- (void)viewDidLoad 
    [super viewDidLoad];

    [imageView setImage:[self image]];
    [imageView sizeToFit];

    [scrollView addSubview:imageView];
    [[self view] addSubview:scrollView];

    [scrollView setContentSize:[self image].size];

    [self logSizesFromMethod:_cmd];

我也在 viewWillAppear 和 viewDidAppear 中记录尺寸。

ImageViewController.m

- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];

    [self logSizesFromMethod:_cmd];


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

    [self logSizesFromMethod:_cmd];

最后,我从控制台得到以下输出。

Homepwner[12188:11303] viewDidLoad - imageView.frame - Width:1400.000000, Height: 1060.000000
Homepwner[12188:11303] viewDidLoad - scrollView.frame - Width:320.000000, Height: 548.000000
Homepwner[12188:11303] viewDidLoad - scrollView.contentSize - Width:1400.000000, Height: 1060.000000
Homepwner[12188:11303] viewWillAppear: - imageView.frame - Width:1400.000000, Height: 1060.000000
Homepwner[12188:11303] viewWillAppear: - scrollView.frame - Width:320.000000, Height: 548.000000
Homepwner[12188:11303] viewWillAppear: - scrollView.contentSize - Width:1400.000000, Height: 1060.000000
Homepwner[12188:11303] viewDidAppear: - imageView.frame - Width:600.000000, Height: 600.000000
Homepwner[12188:11303] viewDidAppear: - scrollView.frame - Width:600.000000, Height: 600.000000
Homepwner[12188:11303] viewDidAppear: - scrollView.contentSize - Width:600.000000, Height: 600.000000

我可以理解为什么 scrollView 帧大小设置为某个默认值,因为调用 viewDidLoad 是在弹出框知道它将自己呈现为什么大小之前。即在 ItemsViewController 内部调用 setPopoverContentSize 之前调用 viewDidLoad。

如果我在 viewDidAppear 方法中手动设置 scrollView 帧大小、imageView 帧大小和 scrollView contentSize,弹出框会完全按照我想要的方式显示,直到我尝试用鼠标滚动,然后一切都会立即恢复到 600x600。

为什么scrollView frame size、imageView frame size和scrollView contentSize在viewWillAppear之后viewDidAppear之前都重置为600x600?

我假设我不了解这里的一些基础知识,我需要更改哪些内容以使 UIPopoverController 中的 UIScrollView 以我想要的方式运行?

【问题讨论】:

【参考方案1】:

尝试将ImageViewController 对象的contentSizeForViewInPopover 属性设置为所需的大小

【讨论】:

感谢您的回答,但是在我的 ImageViewController 的 init 方法中调用 contentSizeForViewInPopover 不会改变结果。

以上是关于了解使用 UIPopoverController 时的 UIScrollView 大小行为的主要内容,如果未能解决你的问题,请参考以下文章

iPad开发中UIPopoverController的使用

UIPopoverController 奇怪的行为

iPad 控件UIPopoverController使用

UIPopoverController 与 PresentFromBarButtonItem 一起使用时设置高度

在 UIPopoverController 中使用 UIImagePickerController 后播放视频消失

自动旋转时出现 UIPopOverController 问题