2011-03-07 52 views
1

我已經使用標題屬性設置了我的導航控制器的標題。我希望標題能夠淡入和響應用戶執行的某些操作。衰落的導航控制器標題輸入/輸出

我目前的解決方案是爲導航控制器提供一個自定義titleView,並且每當我希望標題淡入淡出時,我會爲該視圖的alpha變化設置動畫。這是有效的,但是會產生另一個問題:由於左欄和右欄的寬度不同,我無法居中對齊。

因此,我正在尋找替代解決方案。有沒有另一種方法來淡化導航控制器標題而不使用自定義標題視圖?

編輯:我收到了一些答案,顯示如何通過添加子視圖來完成此操作。雖然這確實啓用了我想要的淡入/淡出功能,但我希望避免在實施該解決方案時遇到問題時使用子視圖。

導航對象中是否有內容允許標題淡出?我已經做了一些研究,並對迄今爲止的反應進行了測量,我猜測事實並非如此。我只是作爲最後的手段發佈,只是告訴任何人知道的一種方式。

回答

-1

快速和骯髒的:你應該能夠通過一個自定義標籤添加到導航欄

[navigationBar addSubview:yourLabel]; 

就設置標籤的框架導航條內的中心位置,像之前修改其alpha值。但是,這是一個真正的黑客攻擊,我不確定它在推送和彈出視圖控制器時的行爲。

編輯:

好的,在這裏你去。首先假定我們有一個導航欄,其中包含標題屬性(不是titleView屬性)以及左右欄按鈕項目集。

UINavigationBar* bar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
[self.view addSubview:bar]; 

UINavigationItem* anItem = [[UINavigationItem alloc] initWithTitle:@"HeyHey"]; 
UIBarButtonItem* leftItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:nil action:nil]; 
UIBarButtonItem* rightItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:nil action:nil]; 
anItem.leftBarButtonItem = leftItem; 
anItem.rightBarButtonItem = rightItem; 
bar.items = [NSArray arrayWithObject:anItem]; 
[leftItem release]; 
[rightItem release]; 
[anItem release]; 

現在你可以淡出標題視圖像這樣:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1]; 
[[[bar subviews] objectAtIndex:0] setAlpha:0]; 
[UIView commitAnimations]; 

我不知道,如果標題視圖總是在指數0,但你可以檢查使用

你的具體情況
for (UIView* aView in bar.subviews) { 
    NSLog(@"%@", aView); 
} 

爲標題查看您會看到類似

<UINavigationItemView: 0x7566530; frame = (0 0; 0 0); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x75665e0>> 
+0

你會如何「設置標籤的框架爲中心」?如果你的意思是我將shuld設置爲標籤的框架,使其中心點位於導航欄的中間,導致我遇到的另一個問題:由於左右欄按鈕的寬度不同,因此我的標題不能使用整理導航欄中的所有空間並居中。不知道這是否足夠清楚,但我認爲這是一個單獨的問題,我應該問。 – ImaginaryCake 2011-03-07 19:36:51

+0

是的,這就是我的意思。我並沒有真正理解你的中心問題。總結一下我的理解:當你使用title屬性時,標題位於欄的中心,但不能淡入。另一方面,當您使用titleView屬性時,您可以淡入標題,但無法正確居中。那是對的嗎?我想到的另一個選項是使用title屬性來設置標題,然後嘗試在導航欄的子視圖數組中盲目地查找以獲取對相應標籤視圖的引用。但我不確定這是否會奏效。 – hennes 2011-03-07 20:37:00

+0

我剛剛檢查,它的工作原理!我上面更新了我的答案。 – hennes 2011-03-08 07:45:24

0

titleUIViewController的財產只是一個NSString。您需要將自定義視圖添加到NavigationBar。

標題

,表示 認爲這控制器管理的本地化字符串。

@屬性(非原子,複製)的NSString *標題

討論

子類應的標題設定爲表示 視圖給用戶的 人類可讀的字符串。如果接收器 是導航控制器,則 默認值是控制器的標題的頂視圖 。

1

這可能是有用ü....

fade.h 

#import <UIKit/UIKit.h> 

@interface RootViewController : UIViewController 
{ 

    UINavigationBar *navigationbar; 

    NSTimer * timer; 
    UILabel * ll; 
     UILabel * l2; 
} 

@property(nonatomic,retain) UINavigationBar *navigationbar; 


@end 

fade.m 

#define FADE_IN_RATE  2.0/100.0 
#define FADE_OUT_RATE  2.0/200.0 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    ll.alpha = 0.0; 
    l2.alpha =1.0; 
    ll = [[UILabel alloc]init]; 
    l2 = [[UILabel alloc]init]; 
    l2.backgroundColor = [UIColor grayColor]; 
    ll.text = @"Name"; 
    ll.backgroundColor = [UIColor grayColor]; 
    ll.frame = CGRectMake(115, 10, 60, 20); 
    l2.frame = CGRectMake(115, 10, 60, 20); 
    [self.navigationController.navigationBar addSubview:ll]; 
    [self.navigationController.navigationBar addSubview:l2]; 
    self.navigationController.navigationBar.tintColor = [UIColor grayColor]; 
    timer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(fadeScreen) userInfo:nil repeats:NO]; 
} 
- (void)fadeScreen 
{ 

    timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(fadeTimerEvent) userInfo:nil repeats:YES]; 


} 

- (void)fadeTimerEvent 
{ 

    if (ll.alpha >= 2) 
    { 
       // At this point, layer1 is now visible 
     [timer invalidate]; 
     timer = nil;  

    } 
    else 
    { 

     // Fade lower layer in (increase alpha) 
     ll.alpha += FADE_IN_RATE; 

     // Fade upper layer out (decrease alpha) 
      l2.alpha -= FADE_OUT_RATE; 
    } 
} 

問候, CNSivakumar

+0

是的,這就是我的答案。如果導航欄與導航控制器耦合,並且您在堆棧中推送視圖控制器,這是如何表現的? – hennes 2011-03-07 19:09:35

+0

我認爲這將使我想要的衰落功能。但是,它需要添加一個子視圖到導航欄,這是我想要避免的。對不起,如果我沒有太清楚的問題,我會更新它。 – ImaginaryCake 2011-03-07 19:29:49

+0

請勿將未記錄的子視圖添加到'navigationController.navigationBar'。使用'navigationItem.titleView'。「titleView」的用途是什麼,這是確保跨iOS功能的唯一方法。 – SwiftArchitect 2014-02-09 16:35:05

1

同意@ImaginaryCake評論:調整的冠軍財產聽起來像一個黑客。正確的方法是使用titleView而不是遍歷UINavitationBar -subviews,並希望它能夠在SDK更新後生存下來。

快速&清洗只需2步;從一個UIViewController,做到:

步驟1:更改titleViewnavigationItem

self.navigationItem.titleView = ({ 
    UILabel * titleView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 20)]; 
    [titleView setTextAlignment:NSTextAlignmentCenter]; 
    [titleView setText:@"HeyHey"]; 

    titleView; 
}); 

步驟2:動畫隨意。

[UIView animateWithDuration:1.0f animations:^{ 
    self.navigationItem.titleView.alpha = 0.5f; 
}];