サブビューで奇妙な動作がUIScrollView
発生しています。アイデアはUIView
、私の場合はフォームであるカスタマイズされた nib ファイルを使用して のインスタンスをプログラムで作成し、そのフォームにモデル クラスのデータを入力し、それを my のサブビューとして追加することUIScrollView
です。問題は、複数のサブビューを処理するUIScrollView
場合で、最新のサブビューのみを保持するため、3 つのサブビューを作成すると、スクロールビューには 3 番目 (最新) のサブビューのみが表示されます。ページ コントロールは、サブビューの corect 数 (3) に設定されていますが。
プロジェクトが長すぎるので、関連するコードで私の問題を簡単に説明しようとします:
- (void)viewDidLoad {
NSArray *sorted = [appArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];//this array contains the data from model, I debugged that to make sure I got the exact data, no more no less :)
//Loop all NSManaged objects, for example let's say I have 3 model objects, don't worry about how I get data etc, because I debugged all and maked sure all data objects number are exact, etc.
for (App_Table *_appTable in sorted) {
//This looped 3 times as expected, I debugged that also and maked sure on each iteration I got the data I expected to have
//App_Table is a subclass of NSManagedObject, it's my model class and get its data from coredata file
[self addMoreView];//Call this method will create a new subview and add it as subview to the UIScrollView, it will also update the page control, update the content size property, etc.
AppTableView *_appTableView = (AppTableView *) [[self.scrollView subviews] lastObject];//Remember addMoreView method create a new instance of AppTableView and add it as subview for the UIScrollView property, then I get that subview to fill it with data here
_appTableView.txtADDRESS.text = _appTable.address;//Fill in the form, no need to write all the form fields code because it's the same way.
// Scroll To First Page...
self.pageControl.currentPage = 0;
[self.scrollView scrollRectToVisible:CGRectMake(0, 0, viewWidth, viewHeight) animated:YES];
self.scrollView.contentSize = CGSizeMake(viewWidth*noOfItems, viewHeight);//Set the content size to the sum of subviews width, I also debugged that to check it's correct
self.scrollView.delegate = self;
[super viewDidLoad];
}
さて、3 つのサブビューがある場合、スクロールビューは上記の行で計算された 3 つのサブビューの幅でロードされます。
self.scrollView.contentSize = CGSizeMake(viewWidth*noOfItems, viewHeight);//Set the content size to the sum of subviews width, I also debugged that to check it's correct
また、3 つの移動 (サブビューの数) までスクロールでき、これUIPageControl
も 3 つのドットに設定されていますが、1 つのサブビューのみが表示され、最新のサブビューのみが表示され、他の 2 つのサブビューが消え、スクロール ビューの計算されたコンテンツが表示されます。それらのサイズですが、表示されません。何かご意見は ?ありがとう。
編集:
ビューを初めて編集するときはすべてうまくいき、3 つのサブビューを扱うときはすべて表示されますが、別のビューに移動してこのビューに戻ると、最後のサブビューのみが表示されることに注意してください。
また、分割ビューでそのための iPad プロジェクトに取り組んでいます。
編集:
これは、新しいサブビューを描画するメソッドのコードですUIScrollView
-(IBAction) addMoreView
{
NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"AppTableView" owner:self options:nil];
AppTableView *aView = [arr objectAtIndex:0];
[aView setFrame:CGRectMake(startX, 0, aView.bounds.size.width, aView.bounds.size.height)];
[self.scrollView addSubview:aView];
self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width+aView.frame.size.width
, self.scrollView.contentSize.height);
startX = startX + aView.frame.size.width;//Update the X position, first 0, then 600, 1200, and so on.
[self.scrollView scrollRectToVisible:aView.frame animated:YES];
NSLog(@"%f",self.scrollView.contentSize.width);
NSLog(@"%f",self.scrollView.contentSize.height);
}
3 つのサブビューがあるとします。上記のメソッドはfor
ループ内に配置されているため、3 回呼び出されます。したがってNSLogs
、上記の方法の結果は次のとおりです。
NSLog(@"%f",self.scrollView.contentSize.width);
NSLog(@"%f",self.scrollView.contentSize.height);
First iteration:
600.000000
0.000000
Second iteration:
1200.000000
0.000000
Third iteration:
1800.000000
0.000000
編集:
rob mayoff によって提案されたコマンドを使用すると、これが発生する理由を確認できます。
| | | | <AppTableView: 0x1eef4700; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 990; layer = <CALayer: 0x1eef4790>>
| | | | <AppTableView: 0x1ee3f380; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 991; layer = <CALayer: 0x1ee3f410>>
| | | | <AppTableView: 0x1ee56910; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 992; layer = <CALayer: 0x1ee3f410>>
3つのサブビューはすべて同じフレームに描画されるため、互いに上にありますが、実行時にブレークポイントを使用してデバッグするとx
、最初は0、次に600、次に1200に変化し、正しく描画されていると思います. 特にx値が正しくインクリメントされていることを修正する方法、それで何が問題なのか、同じx座標にまだ描画されているのはなぜですか?