27

titleView の位置が rightbarbutton のタイトルに依存していることに気付きました。代わりに titleView のフレームを中央に設定するにはどうすればよいですか?

titleView.frame を設定しようとしましたが、役に立ちませんでした。

コードは次のとおりです。

UIButton *titleLabel = [UIButton buttonWithType:UIButtonTypeCustom];
[titleLabel setTitle:@"Right Eye" forState:UIControlStateNormal];
[titleLabel setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[titleLabel setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
titleLabel.frame = CGRectMake(100, 0, 180, 44);
titleLabel.titleLabel.backgroundColor = [UIColor clearColor];
titleLabel.titleLabel.font = [UIFont boldSystemFontOfSize:20.0];
titleLabel.titleLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.3];
//  titleLabel.titleLabel.textAlignment = UITextAlignmentCenter; (this doesn't work either)
[titleLabel addTarget:self action:@selector(titleTap:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.titleView = titleLabel;
self.navigationItem.titleView.frame = CGRectMake(100, 0, 180, 44); //(this doesn't work either)

代替テキスト

4

13 に答える 13

46

ビュー コントローラーの viewWillAppear: と viewDidAppear: の間に、ナビゲーション バーが titleView の位置を変更し、必要に応じてサイズを変更します。ナビゲーション バーがボタンの間に収まるように titleView のサイズを変更しないことを好むため、中心がずれてしまう可能性があります。タイトルビューが十分に小さい場合は中央に配置しようとするようですが、そうでない場合はタイトルビューが中央からずれて移動し、最後の手段としてのみサイズが変更されると思います。その効果は、titleView が 2 つのボタン間のすべてのスペースを占めていることです。その textAlignment が中央に配置されている場合、画面全体に対して中央に配置されるわけではありませんが、そのスペースに中央に配置されます。これはスクリーンショットで確認できます。

1 つの答えは、ナビゲーション バーが中央に配置できるように titleView を狭くすることです。titleView.frame を設定するときは、180 ではなく 160 程度にしてください。あなたのようにプログラムでビューを作成するとき、その幅の見積もりをコードに入れなければならないのは残念です。中心を保ちながらそのスペースを最大化する方法が良いでしょう。

画面幅である titleView から開始して、ナビゲーション バーが titleView.frame を変更した後、View Controller の viewDidAppear: で再度自分で更新することができます。調整された titleView.frame.origin.x と size.width を画面幅とともに使用すると、左右の余白の最大値を計算し、origin.x をそれに設定し、size.width を画面幅から引いた値に設定できます。ただし、プッシュされたビューがアニメーション化され、その後のシフトが表示されるまで有効になりません。viewWillAppear: で titleView を非表示にしてから、viewDidAppear: で非表示に戻すことができます。そのため、中心からずれた titleView でスライドインする代わりに、タイトルが表示されずにスライドインします。

より良い可能性は、titleView を UIView (または UILabel など) の独自のサブクラスにし、setFrame をオーバーライドしてサイズを変更し、スーパービューの中央に配置することです。これを自分でやることになったら、ここに投稿します。または、タイトルビューのフレームが更新された後、ビューのサブクラスなしでビューがスライドする前に、他の誰かがそのフレームを変更する別の場所を知っているかもしれません。

于 2011-02-07T19:48:59.007 に答える
20

titleView または titleLabel を設定したら、それを呼び出しsizeToFitますtitleLabel.textAlignment = UITextAlignmentCenter。ボタンの端とナビゲーション バーの端の間のスペースではなく、ナビゲーション バーの幅の中央に配置されます。

于 2012-02-06T20:51:34.690 に答える
12

ここでの提案はどれも実際にはうまくいきませんでした。私の問題は、ナビゲーション バーが遷移の途中である間に titleView を設定していたことです。

私はsmallduckのアイデアに従い、setFrameをオーバーライドすることになりました。次のように簡単でした:

- (void)setFrame:(CGRect)frame {
    [super setFrame:CGRectMake(0, 0, self.superview.bounds.size.width, self.superview.bounds.size.height)];
}
于 2012-05-10T23:35:03.923 に答える
6

最初にフレームを CGRectZero に設定して、sizeToFit を呼び出すことができます。以下は、タイトル テキストを変更するために使用したコードで、まだ中央に配置されていることを確認しています。左に戻るボタンがありました。

UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];    
label.text = @"Title";
[label sizeToFit];
self.navigationItem.titleView = label;
于 2014-03-08T04:39:14.507 に答える
1

私の解決策は、viewDidAppear でナビゲーション バーのサイズを手動で変更することでした。

- (void)viewDidAppear
{
     [super viewDidAppear];
     [self.navigationController.navigationBar setFrame:CGRectMake(x, y, width, height)];
}

...その後、タイトル ビューの位置を変更することもできます。主な問題は、ナビゲーション バー wqs もサイズ変更されたという事実に気付いたので、通常のサイズに戻しました。デバッグから通常のサイズを取得し、変更される前にviewDidLoadでサイズを確認しました...

于 2014-01-29T11:10:33.977 に答える
1
-(void) awakeFromNib
{
    UIButton *titleLabel = [UIButton buttonWithType:UIButtonTypeCustom];
    [titleLabel setTitle:@"Right Eye" forState:UIControlStateNormal];
    [titleLabel setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [titleLabel setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
    titleLabel.titleLabel.backgroundColor = [UIColor clearColor];
    titleLabel.titleLabel.font = [UIFont boldSystemFontOfSize:20.0];
    titleLabel.titleLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.3];
    [titleLabel addTarget:self action:@selector(titleTap:) forControlEvents:UIControlEventTouchUpInside];
    titleLabel.frame = CGRectMake(0, 0, 400, 20);
    self.navigationItem.titleView = titleLabel;

}
于 2011-05-30T15:06:08.643 に答える
0

ここでも同じ問題。自動スクロール ラベルを titleView として実装します。そのため、ナビゲーション タイトルの長いテキストは、ユーザーがすべて表示できるように自動的にスクロールできます。titleView の不明な実際のサイズに関する問題はすべて、ラベル テキストが収まり、自動スクロールが不要な場合 (navigationItem の title プロパティにテキストを設定するなど) という最も単純な特殊なケースで、テキストのセンタリングを妨げます。

于 2010-11-25T17:46:18.770 に答える
0

少し他のユース ケースがあります (iOS 7 の titleView としての UIButton の垂直オフセット)。contentEdgeInsets長い間、UIButtonのプロパティを使用してフレーム内のコンテンツをシフトすることを思いつきました。

于 2014-03-13T14:01:04.970 に答える
0

これを修正する唯一の方法は、UINavigationItems を使用しないことです。次のように、UINavigationBar のボタン側で 2 つの異なるビューを使用します。

-(UIView *)rightButtonViewSection {
    if (!_rightButtonViewSection) {

        _rightButtonViewSection = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 45)];

    }
    return _rightButtonViewSection;

}

-(UIView *)leftButtonViewSection {
    if (!_leftButtonViewSection) {

        _leftButtonViewSection = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 45)];

    }
    return _leftButtonViewSection;

}

その上にsetButtonsを次のように設定します。

 ButtonBase *searchButton = [[ButtonBase alloc] initWithFrame:CGRectMake(0, 0, 32, 30)];
    [searchButton setImage:[UIImage imageNamed:SEARCH_IMAGE] forState:UIControlStateNormal];
    SEL searchSelector = @selector(tradersSearchButtonPress);
    [searchButton addTarget:self action:searchSelector forControlEvents:UIControlEventTouchUpInside];

    self.notificationButton.view.frame = [self rightButtonFrame];
    searchButton.frame = [self rightSecoundButtonFrame];

    [self.rightButtonViewSection removeAllSubviews];
    [self.rightButtonViewSection addSubview:self.notificationButton.view];
    [self.rightButtonViewSection addSubview:searchButton];

    UIBarButtonItem *buttonItem  = [[UIBarButtonItem alloc] initWithCustomView:self.rightButtonViewSection];
    self.topViewController.navigationItem.rightBarButtonItem = buttonItem;

ボタンフレーム:

-(CGRect) rightButtonFrame {
    return CGRectMake(self.rightButtonViewSection.width - 32, 7, 32, 30);
}
-(CGRect) rightSecoundButtonFrame {
    return CGRectMake(self.rightButtonViewSection.width - 80, 7, 32, 30);
}

それではタイトルが動かない!UIButtonsViews は同じ幅であるためです。

于 2015-03-02T21:15:15.640 に答える