7

サブビューで奇妙な動作が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座標にまだ描画されているのはなぜですか?

4

7 に答える 7

0

ロード時に0に再初期化される静的変数を使用し、サブビューの幅だけインクリメントして、新しいX位置で描画を開始します。

于 2013-05-01T18:24:02.157 に答える
0

autoresizingMaskaView のをaddMoreView メソッド内に設定してみてくださいUIViewAutoresizingNone

于 2013-05-18T01:45:08.397 に答える
0

姉妹投稿であなたのコードを使用するプロジェクトを作成しましたが、問題なく動作しています。以下に示すように、自動サイズ変更マスクにいくつかのテストを追加しました。やっているものと比べてみることをお勧めします。サブビューまたは scrollView のいずれかのマスクが上部/左側に関連付けられるように設定されていない場合、奇妙なことが起こります。

私の変更されたコード:

NSArray *colors = @[ [UIColor redColor], [UIColor greenColor], [UIColor blueColor] ];

UIViewAutoresizing mask;
mask = [self.scrollView autoresizingMask];
//assert(!self.scrollView.autoresizesSubviews); // has no affect here

if((mask & (UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin)) != mask) NSLog(@"scrollView MASK WRONG");

for (int i=0; i<3; ++i) {

    NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"AppTableView" owner:self options:nil];

    NSLog(@"scrollView frame: %@", NSStringFromCGRect(self.scrollView.frame));
    if((mask & (UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin)) != mask) NSLog(@"aView MASK WRONG");

    AppTableView *aView = [arr objectAtIndex:0];
    assert([aView isKindOfClass:[AppTableView class]]);
    NSLog(@"orig aView frame: %@", NSStringFromCGRect(aView.frame));
    UIViewAutoresizing mask = [aView autoresizingMask];
    if((mask & (UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin)) != mask) NSLog(@"aView MASK WRONG");


    aView.frame = CGRectMake(startX, 0, aView.bounds.size.width, aView.bounds.size.height);
    NSLog(@"changed aView frame: %@", NSStringFromCGRect(aView.frame));
    aView.backgroundColor = colors[i];

    [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;

   //AppTableView *_appTableView = (AppTableView *) [[self.scrollView subviews] lastObject];

    //_appTableView.txtADDRESS.text = _appTable.address;//Fill in the form, no need to write all the form fields code because it's the same way.
}
NSLog(@"scrollView frame: %@", NSStringFromCGRect(self.scrollView.frame));
NSLog(@"scrollView contentOffset: %@", NSStringFromCGPoint(self.scrollView.contentOffset));
于 2013-05-18T16:34:53.580 に答える
0

次のコード ブロックが-addMoreView問題です。

AppTableView *aView = [arr objectAtIndex:0];
[aView setFrame:CGRectMake(startX, 0, aView.bounds.size.width, aView.bounds.size.height)];
[self.scrollView addSubview:aView];

変更がない場合startXは、これらすべてのビューを同じ場所に追加しています。

于 2013-04-23T21:47:42.247 に答える