使用UIPopoverController时了解UIScrollView大小行为

时间:2013-05-11 10:15:44

标签: ios objective-c ipad uiscrollview uipopovercontroller

我正在阅读一本关于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在屏幕上显示popover时重置其大小,我创建了一个小方法来打印出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被调用是在popover知道它自己呈现的大小之前。也就是说,在ItemsViewController中调用setPopoverContentSize之前调用viewDidLoad。

如果我在viewDidAppear方法中手动设置了scrollView帧大小,imageView帧大小和scrollView contentSize,则在我尝试使用鼠标滚动之前,弹出窗口正是我想要的,然后所有内容立即快速回到600x600。 / p>

为什么在viewWillAppear之后但在viewDidAppear之前,scrollView帧大小,imageView帧大小和scrollView contentSize都重置为600x600?

我假设我不理解这里的一些基础知识,我需要为UIPopoverController中的UIScrollView更改我的行为方式吗?

1 个答案:

答案 0 :(得分:0)

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