2012-01-13 9 views

答えて

1

UINavigationControllerを継承によってサブクラス化するのは簡単です。それはOOPの重要な概念です。

//YourClass.h 
@interface YourClass : UINavigationController 

@end 
//YourClass.m 
@implementation YourClass 

@end 

しかし

このクラスは、一般的にそのままで使用されているが、iOSの6以降でサブクラス化することができます。

UINavigationControllerの概要で書かれています。したがって、iOS 5以前のバージョンをサポートしている場合は、UINavigationControllerをサブクラス化できない場合があります。あなたのサブクラスが正しく動作しない可能性があります。このstackoverflow topicに関する良い議論を見つけることができます。

+0

私はインターフェイスのためにIBOutletを定義する必要があり、ありがとう! –

+0

いいえ、あなたは 'YourClass'のインスタンスを作成する必要があります。 '[YourClass alloc] init]'などです。しかし、私はあなたがApple docに従うことをお勧めします。目標を説明しようとすると、別の方法を見つけることが可能かもしれません。 –

+0

私のアプリケーション用の画像ギャラリーを作成する必要があり、このapi: 'https:// github.com/gdavis/FGallery-iPhone'が見つかりました。FGalleryはFGalleryViewControllerDelegateプロトコルを実装して、ギャラリー。それから、UIViewControllerと同じようにナビゲーションコントローラスタックにプッシュしてください。Xcode 4.2では、以前のバージョンのようにMainWindowを作成しないため、カスタムUINavigationControllerを作成してギャラリーをプッシュして表示する必要があります。 –

2

私は自分自身を書いています。キーはUIViewControllerをサブクラス化し、self.titleとそのアイコンを最初に「含む」クラスに設定することを忘れないでください。それ以外の場合、tabBarIconsには何も表示されません。 UINavigationControllerUIViewControllerから1レベルしかないので、ヘッダーを表示して実装方法を簡単に確認できますが、それらは「コピーオーバー」する唯一の本当のキーでした。

Interface Builderの場合は、それに合わせてペン先を持っていると仮定して、画面のサイズ(311のタブバーとステータスバーがある場合)のメインビューを作成してから、ナビゲーションバーであり、下側のビューはコンテナとしてアウトレットされています。

注:私がサブビューの相対的な位置を知っているにもかかわらず、ビューをピクセルの高さでずらさずに移動しようとすることに関して、多くの問題にぶつかりました。それは何らかの理由で、たとえ横向きに動くだけであっても仕事をしなかっただけです。

誰もこのタイプのものを持っていないようですので、私はこのコードを投稿しています。これは誰かを助けるかもしれません。 Stephen Johnson。

輸入 "CustomNavigationController.h"

@implementation CustomNavigationController 

@synthesize backgroundImg, title1, title2, title3; 


- (id) initWithRootViewController:(UIViewController*)c; 
{ 

    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 


     containedControllers = [[NSMutableArray alloc] initWithObjects:c, nil]; 
     self.title1.text = c.title; //a custom outlet for text of title, resembling the NavigationController's title basically 

     [container addSubview:c.view]; 
     c.view.frame = container.bounds; 
     back.hidden = YES; //backbutton 
     c.customNavigationController = self; 
     self.title = c.title; 
     self.tabBarItem.image = c.tabBarItem.image; 
    } 
    return self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

- (void) dealloc; 
{ 
    [containedControllers removeAllObjects]; 
    [containedControllers release]; 
    [super dealloc]; 
} 

- (void) pushViewController:(UIViewController*)v animated:(BOOL)a; 
{ 
    float w = container.frame.size.width; 
    float h = container.frame.size.height; 
    [containedControllers addObject:v]; 
    [self.view addSubview:v.view]; 
    // v.view.frame = CGRectMake(w,0,w,h); 
    v.view.frame = container.bounds; 
    v.view.center = CGPointMake(v.view.center.x + w, v.view.center.y + container.frame.origin.y); 
    v.customNavigationController = self; 

    float time = a ? 0.31 : 0; 

    UIViewController * lastViewController = nil; 
    lastViewController = (UIViewController*)[containedControllers lastObject]; 

    [UIView animateWithDuration:time animations:^{ 
     for (UIViewController * c in containedControllers) { 
      // c.view.frame = CGRectMake(c.view.frame.origin.x + w*direction, 0, w, h); 
      c.view.center = CGPointMake(c.view.center.x + w*-1, c.view.center.y); 
     } 
    } completion:^(BOOL finished) { 

     self.title1.text = v.title; 
     back.hidden = NO;   
    }]; 
} 

- (void) popViewControllerAnimated:(BOOL)a; 
{ 
    float w = container.frame.size.width; 
    float h = container.frame.size.height; 
    float time = a ? 0.31 : 0; 

    float direction = 1; 

    [UIView animateWithDuration:time animations:^{ 
     for (UIViewController * c in containedControllers) { 
      // c.view.frame = CGRectMake(c.view.frame.origin.x + w*direction, 0, w, h); 
      c.view.center = CGPointMake(c.view.center.x + w*direction, c.view.center.y); 
     } 
    } completion:^(BOOL finished) { 
      // lastViewController = (UIViewController*)[containedControllers lastObject]; 
      [containedControllers removeLastObject]; 
     self.title1.text = ((UIViewController*)[containedControllers lastObject]).title; 
     if ([containedControllers count] > 1) { 
      back.hidden = NO; 
     } 
     else 
      back.hidden = YES; 

    }]; 
} 

- (IBAction) popLastVC; 
{ 
    [self popViewControllerAnimated:YES]; 
} 
@end 
関連する問題