uinavigationcontrollerのカスタムタイトルビューは、誤ってアニメーション化されています
-
02-10-2019 - |
質問
これは少し愚かに見えるので、私はおそらくここで何か間違ったことをしているでしょう。
すべてのページで同じであるUinavigationControllerに、カスタムタイトルビュー(UILABELの形式)を設定しています。これを容易にするために、アプリデリゲートに関数を作成して、ラベルを正しく表示しました。次に、ナビゲーションスタックにプッシュした直後に、この関数をサブビューで呼び出します。
これがコードです(おそらく私の説明よりも理にかなっています):
//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];
私の問題は、次のビューコントローラーをスタックに押し込み、新しいコントローラーがスムーズにスライドすると、アニメーションの全期間、アニメーションが終了した後、最終的にラベルが左上に付着してから最終的にスナップします。それは本当に奇妙で醜いように見えます。次のビューからスムーズにスライドするように、ラベルを適切にセットアップするにはどうすればよいですか?確かに私が足りないのは簡単なことです...
解決 2
私がやったことは、ヘッダーのバックラウンドとしてテキストを含む画像を使用することでした。そのため、元々望んでいたようにスムーズにアニメーション化するのではなく、まったくアニメーション化していません。
どこでも同じ見出しであることを考えると、それほど大したことではありません。
他のヒント
この質問に対する非常に遅い答えですが、私は同じ問題に遭遇し、画像を使用せずにそれを解決する別の方法を見つけました。誰かが助けになるかもしれないので、私は自分の解決策を共有していると思いました。
私の場合、カスタムUILabelをタイトルビューに設定しています。WiseDidLoadメソッドでTitleViewプロパティを設定したときにのみ、正しくアニメーション化されることに気付きました。ただし、場合によっては、viewDidloadでタイトルがまだわかりませんでした(場合によっては、たとえばHTTPリクエストからタイトルを使用する必要がありました)。したがって、これらのケースに対する私の解決策は、viewdidloadでtext @""を使用してtitleviewプロパティをcustomlabelに設定することでした。実際のタイトルを取得するたびに、カスタムラベルのテキストプロパティを変更しました。
- (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];
私はYLVAと同様の状況にあり、カスタムテキストクラスのインスタンスを使用して UINavigationItem's
titleView
財産。ただし、で構成することがわかりました viewDidLoad
アニメーションのグリッチを解決しませんでした。
問題に対する私の回避策は、問題のビューコントローラーがナビゲーションコントローラーのスタックから飛び出し、その時点で削除するまで待つことでした UINavigationItem's
習慣 titleView
そのため、アニメーション化する必要はありません。
私のとき UINavigationController
サブクラスはを受け取ります popViewControllerAnimated:
メッセージ、カスタムテキストフィールドからタイトルテキストをコピーします(UINavigationItem's
titleView
)に UINavigationItem's
title
プロパティと設定 titleView
nilへの財産。そうして UINavigationController
先に進み、ビューコントローラーから飛び出し、標準のナビゲーションバータイトルラベルのみがアニメーション化されています(私のカスタムタイトルではありません)、グリッチフリーです。