0

ナビゲーションタイトルとサブタイトルを表示するためのカスタム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がある場合、サブビューの「合計」サイズ(?)に応じてサイズが調整されると思いました。

ありがとう

4

1 に答える 1

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];
}
于 2012-11-02T16:40:43.453 に答える