web-dev-qa-db-ja.com

カスタムバックインジケーター画像とiOS 11

アプリでカスタムの戻るボタンを使用しています。このカスタムの戻るボタンは、次のようにグローバルに設定されます。

_    UINavigationBar.appearance().backIndicatorImage = UIImage(named: "Back").withRenderingMode(.alwaysOriginal)
    UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(asset: .back).withRenderingMode(.alwaysOriginal)
_

IOS 11より前のこのコードはトリックを行いましたが、iOS 11では、ここに見られるように、ボタンはもはや垂直に中央に配置されません。

enter image description here

戻るボタンの画像の高さを44に変更することはできましたが、iOS <11では壊れてしまいます。2つの異なる画像を使用することもできますが、画像を垂直方向に中央に配置する方法など、よりきれいなものを探していましたボタンコンテナビュー。

編集:

Banxii1988が言ったように、値が意図的に表示画面の外にタイトルを移動すると、setBackButtonTitlePositionAdjustmentによって問題が発生することがわかります。これは、すべてのView Controllerで戻るボタンのタイトルを削除しないようにするためのハックでした。私はこのハックを削除することを決め、正しいことをしました:

  1. ストーリーボードの戻るボタン項目を_" "_に設定します。
  2. ストーリーボードが関連付けられていない各View Controllerでは、backBarButtonItemをプログラムで設定しますnavigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

View Controllerに表示される戻るボタンのタイトルは、Navigation Stackの前のボタンに設定されていることに注意してください。

22
Luca Torella

1)PositionAdjustmentがあれば削除します。といった

  bap.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -64), for: .default)

2)navスタックの前のViewControllerにタイトルがあるかどうかを確認します

10
banxi1988

この方法は大丈夫だと思います!それは私にとって便利です。

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];
}
12
Tonin

解決できなかった場合:

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以降、戻るボタンのタイトルを非表示にするために使用したコードは、タイトル自体とともに戻るボタンを移動します。ただし、戻るボタンのタイトルを水平方向に移動するだけであれば、すべてが正常に機能し、バックドローはありません。

12
asanli

このソリューションは、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)
    }
5
Eugene

何度か試行して失敗した後、これはiOS 11で機能しました。

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, -5) forBarMetrics:UIBarMetricsDefault];

トリックは、setBackButtonTitlePositionAdjustmentが画像とテキストの両方に影響を与えることが判明したため、x軸上の「Back」テキストをかなり後方に移動し、y軸に少し移動することでした。

ただし、このソリューションがどのくらいの期間動作するかはわかりません。Appleいつでも)によって修正される可能性があります

3
effochka

私はそれを解決する方法をスウィズルすることをお勧めします、私は私のプロジェクトのいくつかでこのソリューションを使用しましたが、うまくいきます。

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
1
Mortgy
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
Yao Li

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)
0
BaQiWL

FOR Swift 3+

     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)
        }
0
MANISH PATHAK