我已使用title属性设置导航控制器的标题。我希望标题能够淡入淡出,以响应用户执行的某些操作。
我目前的解决方案是为导航控制器提供自定义titleView,每当我希望标题淡出时,我会设置该视图的alpha变化动画。这有效,但是又造成了另一个问题:由于左边的条形项和右边的条形项的宽度不同,我无法居中对齐标题。
因此,我正在寻找替代解决方案。是否有另一种方法可以在不使用自定义标题视图的情况下淡化导航控制器标题?
编辑:我已收到一些答案,说明如何通过添加子视图来执行此操作。虽然这确实启用了我想要的淡入/淡出功能,但我希望避免使用子视图,因为我在实现该解决方案时遇到了问题。
导航对象中是否内置了允许标题淡化的内容?我已经做了一些研究,并且到目前为止测量形成了反应,我猜测没有。我只是张贴作为最后的手段,只是因为任何人都知道一种方式。
答案 0 :(得分: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
答案 1 :(得分:1)
同意@ImaginaryCake评论:调整标题属性听起来像是黑客。正确的方法是使用 titleView 而不是遍历UINavitationBar -subviews
,并希望它能够在SDK更新后继续使用。
快速&amp;只需2步即可完成清洁;从UIViewController,执行:
第1步:更改titleView
的{{1}}。
navigationItem
第2步:随意动画。
self.navigationItem.titleView = ({
UILabel * titleView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
[titleView setTextAlignment:NSTextAlignmentCenter];
[titleView setText:@"HeyHey"];
titleView;
});
答案 2 :(得分:0)
title
的{{1}}属性只是UIViewController
。您需要将自定义视图添加到NavigationBar。
标题
表示的本地化字符串 查看此控制器管理。
@property(非原子,复制)NSString *标题
讨论
子类应将标题设置为a 表示的人类可读字符串 对用户的看法。如果接收器 是一个导航控制器, 默认值是顶视图 控制者的头衔。
答案 3 :(得分:-1)
快速而肮脏:您应该可以通过
将自定义标签添加到导航栏[navigationBar addSubview:yourLabel];
只需将标签的框架设置为在导航栏中居中,然后像以前一样修改其alpha值。但是,这是一个真正的黑客,我不确定当你推动和弹出视图控制器时它的行为。
编辑:
好的,你走了。首先假设我们有一个导航栏,其中包含带有 title属性(不是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>>