我正在阅读一本关于 iOS 开发的书,并且正在为 iPad 构建一个测试应用程序。我试图在 iPad 上运行时创建一个弹出框,显示 UIScrollView 显示用户可以滚动的 UIImage。
我遇到的问题是,当弹出框加载时,图像已被拉伸以完全适合弹出框的大小(使滚动既无用又不起作用)。
我无法弄清楚我的应用程序的行为。当用户单击 UITableView 上单元格内的 UIButton 时,我正在创建一个新的 UIPopoverController。
项目视图控制器.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 的框架大小,和滚动视图的内容大小。
在 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。
为什么在viewWillAppear之后viewDidAppear之前scrollView frame size、imageView frame size和scrollView contentSize都重置为600x600?
我假设我在这里不了解一些基础知识,我需要更改哪些 UIScrollView 以使我的 UIPopoverController 内的 UIScrollView 以我想要的方式运行?