Xcode 4 でページベースのアプリケーション テンプレートを使用して PDF のページを読み込み、非表示のテキスト ボックスに UITextView を作成して、ユーザーがメモを書き込めるようにしています。
これまでのところ、すべて機能していますが、UITextView を追加すると、ランドスケープ モードで間違った場所に表示されます (2 ページが表示されます)。
// ModelController.m
- (id)init
{
self = [super init];
if (self) {
NSString *pathToPdfDoc = [[NSBundle mainBundle] pathForResource:@"My PDF File" ofType:@"pdf"];
NSURL *pdfUrl = [NSURL fileURLWithPath:pathToPdfDoc];
self.pageData = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfUrl); // pageData holds the PDF file
}
return self;
}
- (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard
{
// Return the data view controller for the given index.
if( CGPDFDocumentGetNumberOfPages( self.pageData ) == 0 || (index >= CGPDFDocumentGetNumberOfPages( self.pageData )))
return nil;
// Create a new view controller and pass suitable data.
DataViewController *dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"DataViewController"];
dataViewController.dataObject = CGPDFDocumentGetPage( self.pageData, index + 1 ); // dataObject holds the page of the PDF file
[dataViewController view]; // make sure the view is loaded so that all subviews can be accessed
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake( 10, 20, 30, 40 )];
textView.layer.borderWidth = 1.0f;
textView.layer.borderColor = [[UIColor grayColor] CGColor];
[dataViewController.dataView addSubview:textView]; // dataView is a subview of dataViewController.view in the storyboard/xib
CGRect viewFrame = dataViewController.dataView.frame; // <- *** THIS IS THE WRONG SIZE IN LANDSCAPE ***
}
iPad を回転させたときに viewControllerAtIndex が呼び出されないため、ビュー フレームの実際のサイズを知る方法がないため、この動作には本当に驚きました。縦向きと横向きの両方で同じビュー フレームを取得します。
# in Xcode console:
po [dataViewController view]
# result in either orientation:
(id) $4 = 0x0015d160 <UIView: 0x15d160; frame = (0 20; 768 1004); autoresize = RM+BM; layer = <CALayer: 0x15d190>>
#
UITextView を正しく配置するために使用する必要がある変換があるかどうかは誰にもわかりませんか? 要素の位置を個別に保存し、shouldAutorotateToInterfaceOrientation メッセージを受信したときに再配置する必要があるのではないかと心配しています。
Apple が UIPageViewController を不適切に実装した可能性があるようですが、私が見つけることができたのは、まだ解明しようとしているこの部分的な回避策だけでした。
UIPageViewController と画面外の向きの変更
ありがとう!