アプリでカスタムの戻るボタンを使用しています。このカスタムの戻るボタンは、次のようにグローバルに設定されます。
_ UINavigationBar.appearance().backIndicatorImage = UIImage(named: "Back").withRenderingMode(.alwaysOriginal)
UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(asset: .back).withRenderingMode(.alwaysOriginal)
_
IOS 11より前のこのコードはトリックを行いましたが、iOS 11では、ここに見られるように、ボタンはもはや垂直に中央に配置されません。
戻るボタンの画像の高さを44に変更することはできましたが、iOS <11では壊れてしまいます。2つの異なる画像を使用することもできますが、画像を垂直方向に中央に配置する方法など、よりきれいなものを探していましたボタンコンテナビュー。
編集:
Banxii1988が言ったように、値が意図的に表示画面の外にタイトルを移動すると、setBackButtonTitlePositionAdjustment
によって問題が発生することがわかります。これは、すべてのView Controllerで戻るボタンのタイトルを削除しないようにするためのハックでした。私はこのハックを削除することを決め、正しいことをしました:
" "
_に設定します。backBarButtonItem
をプログラムで設定しますnavigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
View Controllerに表示される戻るボタンのタイトルは、Navigation Stackの前のボタンに設定されていることに注意してください。
1)PositionAdjustmentがあれば削除します。といった
bap.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -64), for: .default)
2)navスタックの前のViewControllerにタイトルがあるかどうかを確認します
この方法は大丈夫だと思います!それは私にとって便利です。
if(@available(iOS 11, *)) {
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted];
} else {
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault];
}
解決できなかった場合:
1)プロジェクト内で「setBackButtonTitle」を検索(cmd + shift + f)すると、次のようなコードが見つかります。
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[xController class]]] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
2)これで上記のコードを変更します:
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[xController class]]] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, 0) forBarMetrics:UIBarMetricsDefault];
IOS 11以降、戻るボタンのタイトルを非表示にするために使用したコードは、タイトル自体とともに戻るボタンを移動します。ただし、戻るボタンのタイトルを水平方向に移動するだけであれば、すべてが正常に機能し、バックドローはありません。
このソリューションは、iOS 9、10、11で動作します
var backButtonImage: UIImage = UIImage(named: "backButton")!
UINavigationBar.appearance().backIndicatorImage = backButtonImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backButtonImage
if #available(iOS 11, *) {
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-300, 0), for:UIBarMetrics.default)
} else {
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -200), for:UIBarMetrics.default)
}
何度か試行して失敗した後、これはiOS 11で機能しました。
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, -5) forBarMetrics:UIBarMetricsDefault];
トリックは、setBackButtonTitlePositionAdjustment
が画像とテキストの両方に影響を与えることが判明したため、x軸上の「Back」テキストをかなり後方に移動し、y軸に少し移動することでした。
ただし、このソリューションがどのくらいの期間動作するかはわかりません。Appleいつでも)によって修正される可能性があります
私はそれを解決する方法をスウィズルすることをお勧めします、私は私のプロジェクトのいくつかでこのソリューションを使用しましたが、うまくいきます。
1-UIViewController
のカテゴリを作成します。
2-インポート#import <objc/runtime.h>
。
3-次のメソッドを貼り付けます
#import "UIViewController+Extras.h"
#import <objc/runtime.h>
@implementation UIViewController (Extras)
+ (void)load {
static dispatch_once_t once_token;
dispatch_once(&once_token, ^{
SEL viewDidLoadSelector = @selector(viewDidLoad);
SEL viewDidLoadModifyBackButtonSelector = @selector(modifyBackButton_viewDidLoad);
Method originalMethod = class_getInstanceMethod(self, viewDidLoadSelector);
Method extendedMethod = class_getInstanceMethod(self, viewDidLoadModifyBackButtonSelector);
method_exchangeImplementations(originalMethod, extendedMethod);
});
}
- (void)modifyBackButton_viewDidLoad {
[self modifyBackButton_viewDidLoad];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}
@end
if(@available(iOS 11, *)) {
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted];
} else {
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault];
}
@Toninによる上記の解決策は機能しますが、唯一の懸念事項は、他のアプリ(電子メール、メッセージなど)と共有する場合、ナビゲーションバーの左ボタンテキスト(「キャンセル」など)が透明(クリアカラー)であり、共有機能が必要な場合は色を反転することです:
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[title, URL] applicationActivities:nil];
[activityViewController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
// set clear color when back from share
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
}];
[self presentViewController:activityViewController animated:YES completion:^{
// set white color when share to other app
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal];
}];
1。
extension UINavigationController {
func pushViewC(_ viewController: UIViewController, animated: Bool) {
viewController.navigationItem.leftBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "return").withRenderingMode(.alwaysOriginal), style: .plain, target: navigationController, action: #selector(popViewController(animated:)))
pushViewController(viewController, animated: animated)
}
}
2. pushViewControllerの代わりにpushViewCを使用する
navigationController?.pushViewC(otherVC, animated: true)
if #available(iOS 11, *) {
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
} else {
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0,
-60), for:UIBarMetrics.default)
}