Несколько UIScrollViewControllers в одном окне, некоторые не отображают свои представления - PullRequest
0 голосов
/ 10 сентября 2011

Я пытаюсь отобразить 3 UIScrollViewControllers в том же окне, что и 3 горизонтальные полосы, 3 раза прокручивая экран по ширине.Код для достижения этого приведен ниже, но по какой-то причине он не работает, показывая только верхнюю полосу.

С помощью дополнительного белого фона, который я поместил в окно, я вижу другие 2 области.экрана также можно прокручивать, но по какой-то причине их фоновый цвет не отображается ... Я не могу понять, почему.

Вот код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Creating the window programmatically
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

   CGRect bounds = [self window].bounds;

    float x = bounds.origin.x;
    float y = bounds.origin.y;
    float w = bounds.size.width;
    float h = bounds.size.height;

    CGRect upperFrame = CGRectMake(x,y,w,h/3);
    CGRect middleFrame = CGRectMake(x,y + h/3,w,h/3);
    CGRect lowerFrame = CGRectMake(x, y + 2 * h/3, w, h/3);

    // Creating the scroll view which will contain the 3 views
    UIScrollView *upperScrollView = [[UIScrollView alloc] initWithFrame:upperFrame];
    UIScrollView *middleScrollView = [[UIScrollView alloc] initWithFrame:middleFrame];
    UIScrollView *lowerScrollView = [[UIScrollView alloc] initWithFrame:lowerFrame];

    // ContentSize should be wide enough for 3 pages
    [upperScrollView setContentSize:CGSizeMake(3 * w, h/3)];
    [middleScrollView setContentSize:CGSizeMake(3 * w, h/3)];
    [lowerScrollView setContentSize:CGSizeMake(3 * w, h/3)];

    // Enforce the display of only one page at a time
    [upperScrollView setPagingEnabled:YES];
    [middleScrollView setPagingEnabled:YES];
    [lowerScrollView setPagingEnabled:YES];

    // UPPER SCROLLVIEW

    // This will be the first view (red)
    UIView *redViewU = [[UIView alloc] initWithFrame:upperFrame];
    [redViewU setBackgroundColor:[UIColor redColor]];

    // The second view will start horizontally when the first view ends
    upperFrame.origin.x += w;

    // This will be the second view (green)
    UIView *greenViewU = [[UIView alloc] initWithFrame:upperFrame];
    [greenViewU setBackgroundColor:[UIColor greenColor]];

    // The third view will start horizontally when the second view ends
    upperFrame.origin.x += w;

    // This will be the third view (blue)
    UIView *blueViewU = [[UIView alloc] initWithFrame:upperFrame];
    [blueViewU setBackgroundColor:[UIColor blueColor]];

    // Adding the 3 views to the scroll view
    [upperScrollView addSubview:redViewU];
    [upperScrollView addSubview:greenViewU];
    [upperScrollView addSubview:blueViewU];

    // Now creating the view controller, father of the scrollview
    UIViewController *upperViewController = [[UIViewController alloc] init];
    [upperViewController setView:upperScrollView];

    // MIDDLE SCROLLVIEW

    // This will be the first view (red)
    UIView *redViewM = [[UIView alloc] initWithFrame:middleFrame];
    [redViewM setBackgroundColor:[UIColor redColor]];

    // The second view will start horizontally when the first view ends
    middleFrame.origin.x += w;

    // This will be the second view (green)
    UIView *greenViewM = [[UIView alloc] initWithFrame:middleFrame];
    [greenViewM setBackgroundColor:[UIColor greenColor]];

    // The third view will start horizontally when the second view ends
    middleFrame.origin.x += w;

    // This will be the third view (blue)
    UIView *blueViewM = [[UIView alloc] initWithFrame:middleFrame];
    [blueViewM setBackgroundColor:[UIColor blueColor]];

    // Adding the 3 views to the scroll view
    [middleScrollView addSubview:redViewM];
    [middleScrollView addSubview:greenViewM];
    [middleScrollView addSubview:blueViewM];

    // Now creating the view controller, father of the scrollview
    UIViewController *middleViewController = [[UIViewController alloc] init];
    [middleViewController setView:middleScrollView];

    // LOWER SCROLLVIEW

    // This will be the first view (red)
    UIView *redViewL = [[UIView alloc] initWithFrame:lowerFrame];
    [redViewL setBackgroundColor:[UIColor redColor]];

    // The second view will start horizontally when the first view ends
    lowerFrame.origin.x += w;

    // This will be the second view (green)
    UIView *greenViewL = [[UIView alloc] initWithFrame:lowerFrame];
    [greenViewL setBackgroundColor:[UIColor greenColor]];

    // The third view will start horizontally when the second view ends
    lowerFrame.origin.x += w;

    // This will be the third view (blue)
    UIView *blueViewL = [[UIView alloc] initWithFrame:lowerFrame];
    [blueViewL setBackgroundColor:[UIColor blueColor]];

    // Adding the 3 views to the scroll view
    [lowerScrollView addSubview:redViewL];
    [lowerScrollView addSubview:greenViewL];
    [lowerScrollView addSubview:blueViewL];

    // Now creating the view controller, father of the scrollview
    UIViewController *lowerViewController = [[UIViewController alloc] init];
    [lowerViewController setView:lowerScrollView];

    // A white background view to see at least the scroll indicators
    UIView *whiteView = [[UIView alloc] initWithFrame:bounds];
    [whiteView setBackgroundColor:[UIColor whiteColor]];

    // Finally the window will hold the view controllers' views
    [[self window] addSubview:whiteView];
    [[self window] addSubview:upperViewController.view];
    [[self window] addSubview:middleViewController.view];
    [[self window] addSubview:lowerViewController.view];

    // Displaying the window
    [self.window makeKeyAndVisible];
    return YES;
}

1 Ответ

0 голосов
/ 11 сентября 2011

Решено: после того, как я проделал то же самое с IB, я понял, что по каким-то причинам представления внутри UIScrollView хотят иметь относительные координаты x, y для своих кадров, а не ABSOLUTE.

Изменение фреймов представлений в приведенном выше коде с помощью следующего (одинаково для каждого UIScrollView):

CGRect redViewFrame = CGRectMake(x,y,w,h/3);
CGRect greenViewFrame = CGRectMake(w,y,w,h/3);
CGRect blueViewFrame = CGRectMake(2 * w,y,w,h/3);

решил проблему, и теперь я вижу 3 прокручивающихся фона. Надеюсь, что это поможет кому-то еще :) Я готов, пока.

...