UINavigationBar的titleView的自动位置子视图

时间:2012-10-30 00:11:56

标签: ios uinavigationbar title layoutsubviews titleview

我有一个自定义titleView用于显示导航标题和子标题。 标题字体大于子标题。 这就是我现在所拥有的:

CGRect headerTitleSubtitleFrame = CGRectMake(0, 0, 200, 44);
UIView* _headerTitleSubtitleView = [[[UILabel alloc] initWithFrame:headerTitleSubtitleFrame] autorelease];
_headerTitleSubtitleView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
_headerTitleSubtitleView.backgroundColor = [UIColor clearColor];
_headerTitleSubtitleView.autoresizesSubviews = YES;

CGRect titleFrame = CGRectMake(0, 0, 200, 24);
UILabel *titleView = [[[UILabel alloc] initWithFrame:titleFrame] autorelease];
titleView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
titleView.backgroundColor = [UIColor clearColor];
titleView.font = [UIFont boldSystemFontOfSize:20];
titleView.textAlignment = UITextAlignmentCenter;
titleView.textColor = [UIColor whiteColor];
titleView.shadowColor = [UIColor darkGrayColor];
titleView.shadowOffset = CGSizeMake(0, -1);
titleView.text = @"Title";
titleView.adjustsFontSizeToFitWidth = YES;

CGRect subtitleFrame = CGRectMake(0, 24, 200, 20);
UILabel *subtitleView = [[[UILabel alloc] initWithFrame:subtitleFrame] autorelease];
subtitleView.backgroundColor = [UIColor clearColor];
subtitleView.font = [UIFont boldSystemFontOfSize:13];
subtitleView.textAlignment = UITextAlignmentCenter;
subtitleView.textColor = [UIColor whiteColor];
subtitleView.shadowColor = [UIColor darkGrayColor];
subtitleView.shadowOffset = CGSizeMake(0, -1);
subtitleView.text = @"subtitle";
subtitleView.adjustsFontSizeToFitWidth = YES;


_headerTitleSubtitleView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                             UIViewAutoresizingFlexibleRightMargin |
                                             UIViewAutoresizingFlexibleTopMargin |
                                             UIViewAutoresizingFlexibleBottomMargin);



[_headerTitleSubtitleView addSubview:titleView];
[_headerTitleSubtitleView addSubview:subtitleView];

self.navigationItem.titleView = _headerTitleSubtitleView;

我希望能够在代码中的某个位置删除subTitleView, 但这会使titleView看起来偏离中心(垂直)。

所以我的问题是,你如何在这里实现自动定位? 我应该使用layoutSubviews吗? 如果是这样,那么覆盖它的正确方法是什么?

我认为当容器视图有autoresizingMask时,它会根据它的子视图(?)的“总”大小调整它的大小。

由于

1 个答案:

答案 0 :(得分:0)

我能够通过创建一个单独的视图类来解决这个问题 实现layoutSubviews。 标题标签子视图始终附加。 无论何时需要,都可以删除/添加字幕标签子视图 将调用layoutSubViews以将标题标签视图重新定位在中心。

- (id)initWithFrame:(CGRect)frame
{
    CGRect containerFrame = CGRectMake(0, 0, 200, 44);
    self = [super initWithFrame:containerFrame];
    if (self) {

        self.backgroundColor = [UIColor clearColor];
        self.autoresizesSubviews = YES;

        _title = [[UILabel alloc] initWithFrame:CGRectZero];
        _title.backgroundColor = [UIColor clearColor];
        _title.font = [UIFont boldSystemFontOfSize:20];
        _title.textAlignment = UITextAlignmentCenter;
        _title.textColor = [UIColor whiteColor];
        _title.shadowColor = [UIColor darkGrayColor];
        _title.shadowOffset = CGSizeMake(0, -1);
        _title.adjustsFontSizeToFitWidth = YES;

        _subTitle = [[UILabel alloc] initWithFrame:CGRectZero];
        _subTitle.backgroundColor = [UIColor clearColor];
        _subTitle.font = [UIFont boldSystemFontOfSize:13];
        _subTitle.textAlignment = UITextAlignmentCenter;
        _subTitle.textColor = [UIColor whiteColor];
        _subTitle.shadowColor = [UIColor darkGrayColor];
        _subTitle.shadowOffset = CGSizeMake(0, -1);
        _subTitle.adjustsFontSizeToFitWidth = YES;

        self.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                           UIViewAutoresizingFlexibleRightMargin |
                                           UIViewAutoresizingFlexibleTopMargin |
                                           UIViewAutoresizingFlexibleBottomMargin);
        [self addSubview:_title];
    }
    return self;
}


- (void)layoutSubviews {
    [super layoutSubviews];
    if (([self.subviews count] > 1) && ([[self.subviews objectAtIndex:1] isKindOfClass:[UILabel class]]))
    {
            [[self.subviews objectAtIndex:0] setFrame:CGRectMake(0,0,200,24)];
            [[self.subviews objectAtIndex:1] setFrame:CGRectMake(0,24,200,20)];
    }
    else
        [[self.subviews objectAtIndex:0] setFrame:self.bounds];
}