私は iOS 開発に関する本を読んでおり、iPad 用のテスト アプリケーションを作成しています。ユーザーがスクロールできるUIImageを表示するUIScrollViewを表示するiPadで実行すると、ポップオーバーを作成しようとしています。
私が直面している問題は、ポップオーバーがロードされたときに、画像がポップオーバーのサイズに正確に収まるように引き伸ばされていることです(スクロールが役に立たず、機能しません)。
アプリケーションの動作がわかりません。ユーザーが 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
viewDidLoad が呼び出されたときに scrollView フレームサイズがデフォルトに設定されている理由は、ポップオーバーがどのサイズとして表示されるかを知る前であることを理解できます。つまり、ItemsViewController 内で setPopoverContentSize が呼び出される前に、viewDidLoad が呼び出されます。
viewDidAppear メソッドで scrollView フレーム サイズ、imageView フレーム サイズ、および scrollView contentSize を手動で設定すると、マウスでスクロールしようとするまでポップオーバーが正確に表示され、すべてがすぐに 600x600 に戻ります。
viewWillAppear の後、viewDidAppear の前に、scrollView フレーム サイズ、imageView フレーム サイズ、および scrollView contentSize がすべて 600x600 にリセットされるのはなぜですか?
ここでいくつかの基本的なことを理解していないと仮定していますが、UIPopoverController 内の UIScrollView を希望どおりに動作させるには、何を変更する必要がありますか?