Làm cách nào để ẩn Văn bản Nút Quay lại khỏi Bộ điều khiển UINavigation? Tôi sẽ chỉ có "<" chứ không phải "<Quay lại"
Làm cách nào để ẩn Văn bản Nút Quay lại khỏi Bộ điều khiển UINavigation? Tôi sẽ chỉ có "<" chứ không phải "<Quay lại"
Câu trả lời:
Trong trình tạo giao diện , bạn có thể chọn mục điều hướng của bộ điều khiển trước đó và thay đổi Back Button
chuỗi thành những gì bạn muốn nút quay lại xuất hiện. Ví dụ, nếu bạn muốn nó trống, chỉ cần đặt một khoảng trắng.
Bạn cũng có thể thay đổi nó bằng dòng mã này:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Hoặc trong Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
đã trống trong IB, chỉ cần thêm khoảng trống để bắt đầu Back
và chỉ cần hiển thị mũi tên.
Bạn cũng có thể làm điều này thông qua bảng phân cảnh. Trong trình kiểm tra thuộc tính của mục điều hướng của bộ điều khiển trước đó bạn có thể đặt "" trong trường nút Quay lại. Tham khảo Hình ảnh bên dưới. Thay thế "Tiêu đề của bạn ở đây" thành "". Bằng cách này, bạn sẽ đạt được kết quả mong muốn. Bạn không cần phải lộn xộn với 'Tiêu đề' nữa.
Lập trình bạn có thể sử dụng
[self.navigationItem.backBarButtonItem setTitle:@" "];
trong đó self đề cập đến bộ điều khiển đẩy bộ điều khiển Chế độ xem mong muốn của bạn.
Mẫu trước, sau thanh điều hướng
Trước
Sau
backBarButtonItem
chương trình không hoạt động, nhưng cài đặt qua bảng phân cảnh thì có.
backBarButtonItem
lập lập trình hoạt động đối với tôi trong iOS 9.
Bạn có thể triển khai UINavigationControllerDelegate
như thế này:
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
}
backBarButtonItem
là nil
theo mặc định và nó ảnh hưởng đến bộ điều khiển được đẩy tiếp theo, vì vậy bạn chỉ cần đặt nó cho tất cả bộ điều khiển
Đặt tiêu đề của nút quay lại thành @""
hoặc nil
không hoạt động. Bạn cần đặt toàn bộ nút trống (không có tiêu đề hoặc hình ảnh):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Điều này sẽ được thực hiện trên bộ điều khiển chế độ xem nằm trên bộ điều khiển chế độ xem của bạn trong ngăn xếp điều hướng (tức là từ nơi bạn điều hướng đến VC của mình qua pushViewController
phương thức)
Một giải pháp khác cho vấn đề này đối với các tình huống mà bạn có nhiều bộ điều khiển chế độ xem là sử dụng UIAppearance
proxy để ẩn hiệu quả văn bản tiêu đề nút quay lại như sau:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Giải pháp này sẽ hiển thị văn bản dưới dạng một chấm rõ ràng nhỏ, tương tự như đặt tiêu đề nút quay lại theo cách thủ công @" "
, ngoại trừ việc nó ảnh hưởng đến tất cả các nút trên thanh điều hướng.
Tôi không đề xuất đây là giải pháp chung cho vấn đề vì nó ảnh hưởng đến tất cả các nút trên thanh điều hướng. Nó lật ngược mô hình để bạn chọn thời điểm hiển thị tiêu đề nút, thay vì khi nào ẩn tiêu đề.
Để chọn thời điểm hiển thị tiêu đề, hãy khôi phục theo cách thủ công các thuộc tính văn bản tiêu đề nếu cần hoặc tạo một lớp con chuyên biệt của lớp UIBarButtonItem
này tương tự (có thể với một UIAppearance
proxy khác ).
Nếu bạn có một ứng dụng cần ẩn hầu hết các tiêu đề nút quay lại và chỉ một vài (hoặc không có) nút điều hướng là nút hệ thống có tiêu đề, thì điều này có thể dành cho bạn!
(Lưu ý: cần thay đổi kích thước phông chữ mặc dù màu văn bản rõ ràng để đảm bảo rằng các tiêu đề dài không làm cho tiêu đề của thanh điều hướng chính giữa bị dịch chuyển qua)
Thêm mã sau vào viewDidLoad hoặc loadView
self.navigationController.navigationBar.topItem.title = @"";
Tôi đã thử nghiệm nó trên iPhone và iPad với iOS 9
Bạn có thể thêm danh mục Objective-C này để làm cho tất cả các nút "Quay lại" được tạo bởi bộ điều khiển điều hướng không có văn bản. Tôi vừa thêm nó vào tệp AppDelegate.m của mình.
@implementation UINavigationItem (Customization)
/**
Removes text from all default back buttons so only the arrow or custom image shows up.
*/
-(UIBarButtonItem *)backBarButtonItem
{
return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
Tái bút - (Tôi không biết làm thế nào để tiện ích mở rộng này hoạt động với Swift, nó gặp lỗi kỳ lạ. Các chỉnh sửa hoan nghênh bạn thêm phiên bản Swift)
override
nó nhanh chóng. Rất thú vị câu hỏi
Tôi đã thử một số bên trên và bên dưới nhưng chúng không hoạt động. Điều này đã làm việc cho tôi:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
Điều duy nhất hoạt động mà không có tác dụng phụ là tạo một nút quay lại tùy chỉnh. Miễn là bạn không cung cấp một hành động tùy chỉnh, ngay cả cử chỉ trượt cũng hoạt động.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Thật không may, nếu bạn muốn tất cả các nút quay lại trong không có bất kỳ tiêu đề nào, bạn cần thiết lập nút quay lại tùy chỉnh này trong tất cả các bộ điều khiển chế độ xem của mình: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Điều rất quan trọng là bạn phải đặt khoảng trắng làm tiêu đề chứ không phải chuỗi trống.
để xóa Văn bản khỏi nút ngược theo chương trình, được sử dụng bên dưới Mã này sẽ hoạt động ở dạng xcode7 trở lên.
self.navigationController.navigationBar.topItem.title = @ "";
hoặc là
manualLy trong bảng phân cảnh, chọn thanh điều hướng trên bộ điều khiển chế độ xem và đặt "" vào văn bản nút quay lại.
điều này sẽ hoạt động. cảm ơn
self.navigationController?.navigationBar.topItem?.title = " "
trong Xcode 9 và đã hoạt động!
Câu trả lời hiện tại không hoạt động. Tôi đã muốn xóa hoàn toàn tiêu đề , nhưng dòng chữ "back" không biến mất.
Quay lại bộ điều khiển chế độ xem trước đó và đặt thuộc tính tiêu đề của nó:
self.title = @" ";
CHỈ hoạt động khi Bộ điều khiển Chế độ xem trước đó không có tiêu đề
@""
.
Cách khác - sử dụng lớp NavigationBar tùy chỉnh.
class NavigationBar: UINavigationBar {
var hideBackItem = true
private let emptyTitle = ""
override func layoutSubviews() {
if let `topItem` = topItem,
topItem.backBarButtonItem?.title != emptyTitle,
hideBackItem {
topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
}
super.layoutSubviews()
}
}
Đó là, điều này loại bỏ các tiêu đề trở lại toàn bộ dự án. Chỉ cần đặt lớp tùy chỉnh cho UINavigationController.
Đặt Tiêu đề của VC trước thành chuỗi "" có dấu cách. và tiêu đề có nút quay lại sẽ được thay thế bằng chuỗi dấu cách duy nhất.
Self.title = " "
Khi Quay lại, nhấn lại đặt lại tiêu đề về tiêu đề ban đầu trong viewWillAppear.
Sử dụng một tùy chỉnh NavigationController
ghi đèpushViewController
class NavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
super.pushViewController(viewController, animated: animated)
}
}
Đã có rất nhiều câu trả lời, đây là hai xu của tôi về chủ đề này. Tôi thấy cách tiếp cận này thực sự mạnh mẽ. Bạn chỉ cần đưa cái này vào viewController trước khi chuyển.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Tôi đã thử mọi thứ trong bài đăng này. Giải pháp hoạt động duy nhất là @ VoidLess's
Đây là câu trả lời tương tự nhưng đầy đủ hơn
class CustomNavigationController: UINavigationController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.delegate = self
}
}
// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
}
Đây là giải pháp của tôi cho iOS11, tôi thay đổi giao diện của UIBarButtonItem trong applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Bạn không thể thay đổi độ lệch Y vì nó cũng sẽ thay đổi vị trí của nút thanh quay lại trong iOS11, nhưng hoàn toàn ổn trong iOS10 trở xuống.
Trong Swift3,
Nếu bạn đặt cài đặt chung
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// ..
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
// ...
}
Swift 3.1 Bạn có thể thực hiện việc này bằng cách triển khai phương thức ủy nhiệm của UINavigationController.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
/** It'll hide the Title with back button only,
** we'll still get the back arrow image and default functionality.
*/
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
Đối với những người muốn ẩn tiêu đề nút quay lại trên toàn cầu.
Bạn có thể sự gian lận viewDidLoad
của UIViewController
như thế này.
+ (void)overrideBackButtonTitle {
NSError *error;
// I use `Aspects` for easier swizzling.
[UIViewController aspect_hookSelector:@selector(viewDidLoad)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo)
{
UIViewController *vc = (UIViewController *)aspectInfo.instance;
// Check whether this class is my app's view controller or not.
// We don't want to override this for Apple's view controllers,
// or view controllers from external framework.
NSString *className = NSStringFromClass([vc class]);
Class class = [NSBundle.mainBundle classNamed:className];
if (!class) {
return;
}
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
vc.navigationItem.backBarButtonItem = backButton;
} error:&error];
if (error) {
NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
}
}
Sử dụng:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Tôi đã đấu tranh với điều này vì tôi có một bộ điều khiển điều hướng tùy chỉnh. Tôi đã có thể xóa văn bản mục quay lại trong tất cả các bộ điều khiển chế độ xem bằng mã này trong lớp bộ điều khiển điều hướng tùy chỉnh của mình
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Thao tác này sẽ xóa tất cả các tiêu đề mục quay lại bằng cách sử dụng bộ điều khiển điều hướng tùy chỉnh này.
Nếu bạn đang nhắm mục tiêu iOS 13 trở lên, bạn có thể sử dụng API mới này để ẩn tiêu đề nút quay lại trên toàn cầu .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
Trong iOS 11, chúng tôi nhận thấy rằng việc đặt UIBarButtonItem
phông chữ / màu văn bản của giao diện thành giá trị rất nhỏ hoặc màu rõ ràng sẽ dẫn đến mục thanh khác biến mất (hệ thống không tôn trọng loại mục UIBarButton nữa, nó sẽ chuyển đổi nó thành_UIModernBarButton
). Ngoài ra, thiết lập độ lệch của văn bản trở lại màn hình sẽ dẫn đến nhấp nháy trong cửa sổ bật tương tác.
Vì vậy, chúng tôi xoay xở addSubView
:
+ (void)load {
if (@available(iOS 11, *)) {
[NSClassFromString(@"_UIBackButtonContainerView") jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
}
}
- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
view.alpha = 0;
if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (id)view;
[button setTitle:@" " forState:UIControlStateNormal];
}
[self MyiOS11BackButtonNoTextTrick_addSubview:view];
}
-(void)setNavigationItems{
UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];
self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
[self.navigationController popViewControllerAnimated:YES];
}
Văn bản phía sau đến từ navigationItem.title
,của Bộ điều khiển Chế độ xem cuối cùng và navigationItem.title
được đặt tự động bởi self.title
. Vì vậy, cách dễ dàng để giải quyết vấn đề là mócsetTitle:
, hãy đảm bảonavigationItem.title = @""
Đặt mã này theo AppDelegate.m
ý mình sẽ ổn thôi。
[UIViewController aspect_hookSelector:@selector(setTitle:)
withOptions:AspectPositionAfter
usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
UIViewController *vc = aspectInfo.instance;
vc.navigationItem.titleView = ({
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
titleLabel.text = title;
titleLabel;
});
vc.navigationItem.title = @"";
} error:NULL];
Thông tin chi tiết tại https://www.jianshu.com/p/071bc50f1475(Chinease đơn giản)
Giải pháp của tôi: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
Một cách rất đơn giản - mặc dù có lẽ hơi khó hiểu - theo cách lập trình này nếu bạn không cần nút quay lại tùy chỉnh là đặt kích thước phông chữ bằng 0 trong bộ điều khiển chế độ xem mà bạn đang đẩy lên ngăn xếp, gọi một cái gì đó như thế này từ viewDidLoad
private func setupNavBar() {
let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
appearance.backButtonAppearance = backButtonAppearance
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
navigationItem.compactAppearance = appearance
}
Cuối cùng đã tìm thấy giải pháp hoàn hảo để ẩn văn bản trở lại mặc định trong toàn bộ ứng dụng.
Chỉ cần thêm một Hình ảnh trong suốt và thêm mã sau vào AppDelegate của bạn.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Phương pháp sau hoạt động trên iOS 11 và an toàn để không gặp sự cố trên các phiên bản iOS khác. Làm điều này có thể khiến ứng dụng của bạn bị từ chối trong bài đánh giá của App Store vì cả UIModernBarButton và UIBackButtonContainerView đều là các API riêng tư. Đặt trong AppDelegate.
if
let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {
let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
backButton.setTitleColor(.clear, for: .normal)
}
Phiên bản Swift, hoạt động hoàn hảo trên toàn cầu:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)
return true
}
solution
. Như @limfinity chỉ, nó sẽ thay đổi nó phổ biến cho tất cả của các UIBarButtonItem suốt ứng dụng