IOS 6子视图在父视图中重叠工具栏

时间:2013-06-24 19:01:09

标签: ios ios6 interface-builder

first subview (BIDBlueViewController's BlueView.xib

我正在关注Apress Beginning IOS 6 for school,我们被教授要求实施一个自定义算法,在每次按下工具栏中的“下一个视图”按钮时切换3个视图(蓝色,黄色和绿色) 。我的方法是在不同的索引处添加子视图,并在BIDSwitchViewController.m中对层次结构中的视图进行洗牌:

#import "BIDSwitchViewController.h"
#import "BIDYellowViewController.h"
#import "BIDBlueViewController.h"
#import "BIDGreenViewController.h"

NSInteger count;

@interface BIDSwitchViewController ()

@end

@implementation BIDSwitchViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.yellowViewController = [[BIDYellowViewController alloc] initWithNibName:@"YellowView"
                                                                              bundle:nil];
        self.greenViewController = [[BIDGreenViewController alloc] initWithNibName:@"GreenView"
                                                                            bundle:nil];
        self.blueViewController = [[BIDBlueViewController alloc] initWithNibName:@"BlueView"
                                                                          bundle:nil];
        //the topmost view is the last one in the stack (2)
        [self.view insertSubview:self.blueViewController.view atIndex:2];
        [self.view insertSubview:self.yellowViewController.view atIndex:1];
        [self.view insertSubview:self.greenViewController.view atIndex:0];
        [self.view setBackgroundColor:self.blueViewController.view.backgroundColor];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.blueViewController = [[BIDBlueViewController alloc]
                               initWithNibName:@"BlueView" bundle:nil];
    [self.view insertSubview:self.blueViewController.view atIndex:0];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.;
    self.blueViewController = nil;
    self.yellowViewController = nil;
    self.greenViewController = nil;
}

- (IBAction)switchViews:(id)sender
{
    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationTransition:                  
     UIViewAnimationTransitionFlipFromRight                 
                           forView:self.view cache:YES];
    switch (count)
    {
        case 0:
            [self.view sendSubviewToBack:self.blueViewController.view];
            [self.view bringSubviewToFront:self.yellowViewController.view];
            [self.view setBackgroundColor:self.yellowViewController.view.backgroundColor];
            break;
        case 1:
            [self.view sendSubviewToBack:self.yellowViewController.view];
            [self.view bringSubviewToFront:self.greenViewController.view];
            [self.view setBackgroundColor:self.greenViewController.view.backgroundColor];
            break;
        case 2:
            [self.view sendSubviewToBack:self.greenViewController.view];
            [self.view bringSubviewToFront:self.blueViewController.view];
            [self.view setBackgroundColor:self.blueViewController.view.backgroundColor];
            break;
    }
    if (++count >= 3)
    {
        count = 0;
    }
    [UIView commitAnimations];
}

@end

以下是BIDAppDelegate.m中的代码,其中根视图控制器被添加为BIDSwitchViewController的一个实例:

@implementation BIDAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    self.switchViewController = [[BIDSwitchViewController alloc]
                                 initWithNibName:@"SwitchView" bundle:nil];
    UIView *switchView = self.switchViewController.view;
    CGRect switchViewFrame = switchView.frame;
    switchViewFrame.origin.y += [UIApplication
                                 sharedApplication].statusBarFrame.size.height;
    switchView.frame = switchViewFrame;
    //[self.window addSubview:switchView];
    self.window.rootViewController = self.switchViewController;


    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

BIDSwitchViewController.h头文件:

#import <UIKit/UIKit.h>
@class BIDSwitchViewController;
@interface BIDAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) BIDSwitchViewController *switchViewController;

@end

当视图从蓝色切换时,应用程序和逻辑都工作 - &gt;黄色 - &gt;绿色再回到蓝色。如第一张图片(BIDBlueViewController的BIDSubViewController的BlueView.xib子视图)所示,每个视图都略微重叠工具栏。在我的一个同学的帮助下,我对IB中的所有模拟指标进行了双倍和三倍检查:

Interface Builder 1

enter image description here

我是否通过视图层次结构数组来调整最顶层视图,而不是通过本书的“removeFromParentViewController()”方法删除每个视图,或者是他们的另一个隐藏原因,即子视图没有正确地坐在里面/在父视图后面?

1 个答案:

答案 0 :(得分:0)

你的UIToolbar控件的Z-Order视图位于你的蓝色视图控制器后面。由于您是在IB中创建的,因此可以为其添加IBOutlet,并将其视图置于父视图的顶部。您正在将ViewControllers加载为子视图,因此它们都是您父级的self.view的子视图。

在标题定义中:

IBOutlet *toolBar UIToolbar;

在实施中加入。

[self.view bringSubviewToFront:toolBar];

您可以在添加蓝色控制器子视图后或在所有案例陈述结束时执行此操作。