UINavigationController上的自定义titleView动画设置不正确

时间:2010-09-13 00:27:50

标签: cocoa-touch animation uinavigationcontroller titleview

我可能在这里做错了,因为这看起来有点愚蠢 我在我的UINavigationController上设置了一个自定义titleView(以UILabel的形式),在每个页面上都是相同的。为了实现这一点,我在我的app delegate中创建了一个函数来正确显示标签。然后,在我将其推送到导航堆栈后,我在任何子视图上调用此函数 这是代码(可能比我的解释更有意义):

//In MyAppDelegate.m:
- (void)showTitleForNavigationController:(UINavigationController*) navController {
    UILabel *label = [[UILabel alloc] init];
    // set up label attributes
    // ...
    [label sizeToFit]; //without this line my label won't show at all
    [navController.navigationBar.topItem setTitleView:label];
    [label release];
}

// In SomeViewController.m, when pushing another controller onto the stack:
    UIViewController *otherViewController = //initialize other view controller;
    [self.navigationController pushViewController:otherViewController animated:YES];
    [(MyAppDelegate*)[[UIApplication sharedApplication] delegate] showTitleForNavigationController:otherViewController.navigationController];

我的问题是,当我将下一个视图控制器推入堆栈,并且新控制器平滑滑动时,在动画的整个持续时间内,标签粘在左上方,然后在动画结束后最终卡入到位。它看起来很奇怪和丑陋。 如何正确设置标签,使其从下一个视图平滑滑动?当然,这很简单,我很想念......

3 个答案:

答案 0 :(得分:3)

这个问题的答案非常晚,但我遇到了同样的问题并找到了解决问题的另一种方法,而没有使用图像。以为我会分享我的解决方案,因为它可能对某人有帮助。

在我的情况下,我将自定义UILabel设置为titleview,我意识到只有当我在viewDidLoad方法中设置titleview属性时,它才能正确动画。但是在某些情况下,我在viewDidLoad中还不知道标题(在某些情况下,我需要使用http请求中的标题)。所以,我对这些案例的解决方案是在viewDidLoad中使用text @“”将titleview属性设置为我的自定义标签,每当我得到真正的标题时,我只更改了自定义标签的text属性。

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

   //set temporary title, the MBMUINavigationBarTitleView is a UIView subclass whose  viewWithTitle method returns an autoreleased UIlabel with my custom settings, custom font etc.
   self.navigationItem.titleView = [MBMUINavigationBarTitleView viewWithTitle:@" "];
}

//somewhere later, when I have the real title
UILabel* titleLabel = (UILabel*)self.navigationItem.titleView;
[titleLabel setText:theRealTitle];

答案 1 :(得分:0)

我最终做的是使用包含文字的图像作为标题的背景,所以不是根据我原本想要的顺利制作动画,它根本不是动画。
考虑到它在任何地方都是相同的标题,但它并没有那么重要。

答案 2 :(得分:0)

我和ylva的情况类似,使用UINavigationItem's titleView属性的自定义文本类的实例。但是,我发现在viewDidLoad中配置它并没有解决动画故障。

我解决问题的方法是等到有问题的视图控制器从导航控制器的堆栈中弹出,然后删除UINavigationItem's自定义titleView,这样就永远不会需要动画。

当我的UINavigationController子类收到popViewControllerAnimated:条消息时,我会将标题文字从我的自定义文字字段(UINavigationItem's titleView)复制到UINavigationItem's } title属性并将titleView属性设置为nil。然后UINavigationController继续并从视图控制器弹出,只有标准的导航栏标题标签是动画的(不是我的自定义标题),无故障。