多个UIScrollViewControllers在同一个窗口中,有些不显示其视图

时间:2011-09-10 18:37:11

标签: ios uiviewcontroller uiscrollview

我试图在同一个窗口中显示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 :(得分:0)

解决:成功用IB做同样的事后我意识到由于某种原因,UIScrollView中的视图需要RELATIVE 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个滚动背景。 希望它可以帮助别人:)我现在已经完成了。