【问题标题】:Fading navigation controller title in/out淡入/淡出导航控制器标题
【发布时间】:2011-07-10 12:07:17
【问题描述】:

我已经用 title 属性设置了我的导航控制器的标题。我希望标题能够淡入淡出以响应用户执行的某些操作。

我当前的解决方案是为导航控制器提供自定义的 titleView,并且只要我希望标题淡出,我就会为该视图的 alpha 更改设置动画。这可行,但会产生另一个问题:我无法将标题居中对齐,因为左栏项目和右栏项目的宽度不同。

因此,我正在寻找替代解决方案。是否有另一种方法可以在不使用自定义标题视图的情况下淡化导航控制器标题?

编辑:我收到了一些答案,展示了如何通过添加子视图来做到这一点。虽然这确实启用了我想要的淡入/淡出功能,但我想避免使用子视图,因为我在实施该解决方案时遇到了问题。

导航对象中是否内置了允许标题淡化的功能?我已经做了一些研究,并评估了迄今为止的反应,我猜没有。我只是作为最后的手段发帖,以防万一有人知道。

【问题讨论】:

    标签: iphone uinavigationcontroller title fade


    【解决方案1】:

    同意@ImaginaryCake 的评论:调整title 属性听起来像个hack。正确的方法是使用 titleView 而不是遍历 UINavitationBar -subviews 并希望它能够在 SDK 更新后继续存在。

    只需 2 个步骤即可快速清洁;从 UIViewController 执行:

    第 1 步:将 titleView 更改为您的 navigationItem

    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;
    }];
    

    【讨论】:

      【解决方案2】:

      它可能对你有用....

      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

      【讨论】:

      • 是的,这就是我在回答中的意思。如果导航栏耦合到导航控制器并且您将视图控制器推送到堆栈上,这会如何表现?
      • 我认为这将启用我想要的褪色功能。但是,它需要向导航栏添加一个子视图,这是我想要避免的。抱歉,如果我没有在问题中说得太清楚,我会更新它。
      • 不要将未记录的子视图添加到navigationController.navigationBar。使用navigationItem.titleView。这就是 titleView 的用途,这是确保跨 iOS 功能的唯一方法。
      【解决方案3】:

      UIViewControllertitle 属性只是一个 NSString。您需要将自定义视图添加到 NavigationBar。

      标题

      一个本地化的字符串,表示 查看该控制器管理的视图。

      @property(非原子,复制) NSString *标题

      讨论

      子类应该将标题设置为 人类可读的字符串,表示 对用户的看法。如果接收方 是一个导航控制器, 默认值为顶视图 控制器的标题。

      【讨论】:

        【解决方案4】:

        又快又脏:您应该可以通过

        向导航栏添加自定义标签
        [navigationBar addSubview:yourLabel];
        

        只需将标签的框架设置为在导航栏中居中,并像以前一样修改其 alpha 值。但是,这是一个真正的 hack,我不确定当您推送和弹出视图控制器时它的行为如何。

        编辑:

        好的,给你。首先假设我们有一个导航栏,其中包含一个具有 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>>
        

        【讨论】:

        • 如何“将标签的框架设置为居中”?如果您的意思是我应该设置标签的框架,使其中心点位于导航栏的中间,这会导致我遇到的另一个问题:由于左右栏按钮的宽度不同,我的标题不能使用向上导航栏中的所有空间并居中。不知道这是否解释得足够清楚,但我认为这是一个我应该问的单独问题。
        • 是的,我就是这个意思。我真的不明白你的居中问题。总结一下我的理解:当您使用 title 属性时,标题以栏为中心,但您不能淡化它。另一方面,当您使用 titleView 属性时,您可以淡化标题,但不能正确居中。那是对的吗?我想到的另一个选择是使用 title 属性来设置标题,然后尝试在导航栏的 subviews 数组中盲目地四处寻找以获取对相应标签视图的引用。但我不确定这是否会成功。
        • 感谢您的跟进。这正是我的想法,尽管我认为这不是一个非常“正确”的方式。我想真的没有其他方法可以做到这一点。接受这是最好的工作答案,但它仍然感觉像一个黑客。
        • 嗯,这确实是一个 hack。并且不保证在 SDK 更新后仍然可以工作。但正如你所说,那里(可能)没有其他方法可以做你想做的事。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        • 2013-03-08
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多