4

私は Objective-C を初めて使用し、iOS 用の最初のアプリを作成しようとしています。アイデアは非常に単純ですが、私は最初のアーキテクチャ構築ですでに失敗しています。

ビューがロードされたときに動的に作成する必要がある、複数のタブに表示されるさまざまなビューを作成したいと思います。さらに、アプリには、実行時にタブを動的に追加する機能が必要です。タブ ビューは画面全体に表示するのではなく、トップ ビューの 2/3 を占める必要があります。下部の残りの 1/3 は、再び 2 つのサブビューに分割されています。これらは、タブ スイッチで変更することを意図していません。

私が行ったことは、UIWindow、UITabBarController、および 2 つの UIViewControllers (2 つのタブ用) と 1 つ (または図のように 2 つ) を作成することです。

これまでのところ、異なるタブビューを切り替えることができましたが、CGMakeRect を使用して両方のタブの UIViewControllers を任意のサイズに変更しようとするとすぐに、常に同じままで画面全体をカバーします。

下部に作成されたサブビューには、何らかの理由でクリックできないボタンが含まれています。タブビューからカバーされているためかもしれません。

これらのビューを構築する方法を教えてください。

どうもありがとう!

これが私のコードです:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];


UIViewController *test = [[UIViewController alloc] init];
test.view.backgroundColor = [UIColor grayColor];
test.view.frame = CGRectMake(0, 0, 320, 200);

UIButton *button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button3 setTitle:@"View 3" forState:UIControlStateNormal];
button3.frame = CGRectMake(30.0, 30.0, 120.0, 50.0);
[test.view addSubview:button3];


UITabBarController *tabBarController = [[UITabBarController alloc] init];

UIViewController *viewController1 = [[UIViewController alloc] init];
UITabBarItem *tab1 = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemBookmarks tag:1];
[viewController1 setTabBarItem:tab1];

UIViewController *viewController2 = [[UIViewController alloc] init];
UITabBarItem *tab2 = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemContacts tag:2];
[viewController2 setTabBarItem:tab2];


UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"View from Tab 1" forState:UIControlStateNormal];
button.frame = CGRectMake(100.0, 100.0, 120.0, 50.0);
[viewController1.view addSubview:button];

UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setTitle:@"View from Tab 2" forState:UIControlStateNormal];
button2.frame = CGRectMake(100.0, 100.0, 120.0, 50.0);
[viewController2.view addSubview:button2];


tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];

self.window.rootViewController = tabBarController;
[self.window addSubview:test.view];

[self.window makeKeyAndVisible];
4

1 に答える 1

0

実際には、カスタム コンテナー ビュー コントローラーのおかげでそれを実現する方法があります。

を、ウィンドウの rootViewController としてUITabBarControllerのカスタム サブクラスに置き換えます。UIViewController次に、そのviewDidLoadメソッド (または必要に応じて別の場所) に、上記のほぼ正確なコードを少し変更して追加します。メソッドの完全なコードはviewDidLoad次のとおりです (変更された行の上にコメントを追加しました)。

- (void)viewDidLoad
{
    [super viewDidLoad];


    UITabBarController *tabBarController = [[UITabBarController alloc] init];

    UIViewController *viewController1 = [[UIViewController alloc] init];

    //Mod1: Set an autoresizingMask 
    //so that the view always fills the tabBarController's view
    //if needed you can also set it's frame here
    viewController1.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    UITabBarItem *tab1 = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemBookmarks tag:1];
    [viewController1 setTabBarItem:tab1];

    UIViewController *viewController2 = [[UIViewController alloc] init];

    //Mod2: Same here
    viewController2.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    UITabBarItem *tab2 = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemContacts tag:2];
    [viewController2 setTabBarItem:tab2];


    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button setTitle:@"View from Tab 1" forState:UIControlStateNormal];
    button.frame = CGRectMake(100.0, 100.0, 120.0, 50.0);
    [viewController1.view addSubview:button];

    UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button2 setTitle:@"View from Tab 2" forState:UIControlStateNormal];
    button2.frame = CGRectMake(100.0, 100.0, 120.0, 50.0);
    [viewController2.view addSubview:button2];

    tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];


    //Mod3: Set the frame and autoresizingMask of the tabBarController 
    //to fill the rootVC's view
    tabBarController.view.frame = self.view.bounds;
    tabBarController.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;


    //Mod4: This is the important part:
    //add the tabBarController as childVC of the rootVC
    [self addChildViewController:tabBarController];
    [self.view addSubview:tabBarController.view];
    [tabBarController didMoveToParentViewController:self];



    //Mod5: calculate the frame for the 'static' vc on the bottom
    float heightForStaticVC = 200.0f;

    float yPosForStaticVC = tabBarController.view.frame.size.height - tabBarController.tabBar.frame.size.height - heightForStaticVC;


    UIViewController *test = [[UIViewController alloc] init];

    //Mod6: again setting the autoresizingMask
    test.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;
    test.view.backgroundColor = [UIColor grayColor];
    test.view.frame = CGRectMake(0, yPosForStaticVC, 320, heightForStaticVC);

    UIButton *button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button3 setTitle:@"View 3" forState:UIControlStateNormal];
    button3.frame = CGRectMake(30.0, 30.0, 120.0, 50.0);
    [test.view addSubview:button3];

    //Mod7: and again adding it as childVC of the rootVC
    [self addChildViewController:test];
    [self.view addSubview:test.view];
    [test didMoveToParentViewController:self];

}

もちろん、必要に応じてサイズ変更、配置、および自動サイズ変更の動作を変更できます。

結果は次のようになります。

Tab1 縦長 Tab2 縦長

Tab1 横向き

Tab2 横向き

于 2012-10-31T18:21:14.860 に答える