开发者

Multiple UIScrollViewControllers on the same window, some not showing their views

开发者 https://www.devze.com 2023-04-03 19:44 出处:网络
I am trying to display 3 UIScrollViewControllers in the same window as 3 horizontal stripes 3 times the screen wide scrolling indipendently. The code to achieve this is below but for some reason it do

I am trying to display 3 UIScrollViewControllers in the same window as 3 horizontal stripes 3 times the screen wide scrolling indipendently. The code to achieve this is below but for some reason it doesn't work, showing only the upper stripe.

With the help of the additional white background view I placed on the window I can see the other 2 regions of the screen are scrollable as well, but for some reason their background color is not showing up...I can't figure out why.

Here is the code:

- (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];
    [low开发者_运维知识库erScrollView 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;
}


Solved: after succeeding doing the same thing with IB I realized that for some reason the views inside the UIScrollView want RELATIVE x,y coordinates for their frames, not ABSOLUTE.

Changing the frames of the views in the above code with the following (the same for every 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);

solved the issue, and now I can see the 3 scrolling backgrounds. Hope it helps someone else :) I am done, for now.

0

精彩评论

暂无评论...
验证码 换一张
取 消