ฉันจะซ่อนข้อความปุ่มย้อนกลับจาก UINavigation Controller ได้อย่างไร? ฉันจะมีเพียงปุ่ม "<" และไม่ "<ย้อนกลับ"
ฉันจะซ่อนข้อความปุ่มย้อนกลับจาก UINavigation Controller ได้อย่างไร? ฉันจะมีเพียงปุ่ม "<" และไม่ "<ย้อนกลับ"
คำตอบ:
ในตัวสร้างอินเทอร์เฟซคุณสามารถเลือกรายการการนำทางของตัวควบคุมก่อนหน้าและเปลี่ยนBack Button
สตริงตามที่คุณต้องการให้ปุ่มย้อนกลับปรากฏ ตัวอย่างเช่นหากคุณต้องการให้ว่างให้ใส่ช่องว่าง
คุณยังสามารถเปลี่ยนได้ด้วยโค้ดบรรทัดนี้:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
หรือในSwift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
ว่างใน IB อยู่แล้วเพียงแค่เพิ่มช่องว่างเพื่อขึ้นรถBack
และแสดงลูกศร
คุณสามารถทำได้ผ่านสตอรีบอร์ด ในตัวตรวจสอบแอตทริบิวต์ของรายการการนำทางของตัวควบคุมก่อนหน้านี้คุณสามารถตั้งค่า "" ในช่องปุ่มย้อนกลับ ดูภาพด้านล่าง แทนที่ "Your Title here" เป็น "" เมื่อทำเช่นนี้คุณจะได้ผลลัพธ์ที่ต้องการ คุณไม่จำเป็นต้องยุ่งกับ 'หัวข้อ' อีกต่อไป
โดยทางโปรแกรมคุณสามารถใช้ได้
[self.navigationItem.backBarButtonItem setTitle:@" "];
โดยที่ตัวเองหมายถึงคอนโทรลเลอร์ซึ่งผลักดันคอนโทรลเลอร์ View ที่คุณต้องการ
ตัวอย่างก่อนหลังแถบนำทาง
ก่อน
หลังจาก
backBarButtonItem
โปรแกรมจะไม่ทำงาน แต่การตั้งค่าผ่านสตอรี่บอร์ดทำได้
backBarButtonItem
โปรแกรมใช้งานได้สำหรับฉันใน iOS 9
คุณสามารถใช้งานได้UINavigationControllerDelegate
ดังนี้:
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
เป็นnil
ค่าเริ่มต้นและจะมีผลต่อตัวควบคุมแบบพุชถัดไปดังนั้นคุณเพียงแค่ตั้งค่าสำหรับคอนโทรลเลอร์ทั้งหมด
การตั้งชื่อปุ่มย้อนกลับเป็น@""
หรือnil
ไม่ทำงาน คุณต้องตั้งค่าปุ่มทั้งหมดให้ว่าง (โดยไม่มีชื่อหรือรูปภาพ):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
สิ่งนี้ควรทำบนตัวควบคุมมุมมองที่อยู่ด้านบนของตัวควบคุมมุมมองของคุณในสแต็กการนำทาง (เช่นจากที่ที่คุณนำทางไปยัง VC ของคุณด้วยpushViewController
วิธีการ)
อีกวิธีหนึ่งสำหรับปัญหานี้สำหรับสถานการณ์ที่คุณมีตัวควบคุมมุมมองจำนวนมากคือการใช้UIAppearance
พร็อกซีเพื่อซ่อนข้อความชื่อปุ่มย้อนกลับอย่างมีประสิทธิภาพเช่นนี้:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
โซลูชันนี้จะแสดงผลข้อความเป็นจุดเล็ก ๆ ที่ชัดเจนคล้ายกับการตั้งชื่อปุ่มย้อนกลับด้วยตนเอง@" "
ยกเว้นว่าจะมีผลกับปุ่มแถบนำทางทั้งหมด
ฉันไม่แนะนำให้ใช้วิธีนี้เป็นวิธีแก้ปัญหาทั่วไปเนื่องจากมีผลต่อปุ่มแถบนำทางทั้งหมด มันจะพลิกกระบวนทัศน์เพื่อให้คุณเลือกว่าจะแสดงชื่อปุ่มเมื่อใดแทนที่จะซ่อนชื่อเรื่อง
หากต้องการเลือกว่าจะแสดงชื่อเรื่องเมื่อใดให้เรียกคืนแอตทริบิวต์ข้อความหัวเรื่องด้วยตนเองตามต้องการหรือสร้างคลาสย่อยพิเศษUIBarButtonItem
ที่ทำเช่นเดียวกัน (อาจใช้กับUIAppearance
พร็อกซีอื่น)
หากคุณมีแอปที่ต้องซ่อนชื่อปุ่มย้อนกลับส่วนใหญ่และปุ่มนำทางเพียงไม่กี่ปุ่ม (หรือไม่มีเลย) เป็นปุ่มระบบที่มีชื่อเรื่องสิ่งนี้อาจเหมาะสำหรับคุณ!
(หมายเหตุ: จำเป็นต้องเปลี่ยนขนาดตัวอักษรแม้ว่าสีของข้อความจะชัดเจนเพื่อให้แน่ใจว่าชื่อเรื่องยาวจะไม่ทำให้ชื่อแถบนำทางกลางเลื่อนไป)
เพิ่มรหัสต่อไปนี้ใน viewDidLoad หรือ loadView
self.navigationController.navigationBar.topItem.title = @"";
ฉันทดสอบใน iPhone และ iPad ด้วย iOS 9
คุณสามารถเพิ่มหมวด Objective-C นี้เพื่อทำให้ปุ่ม "ย้อนกลับ" ทั้งหมดที่สร้างโดยตัวควบคุมการนำทางไม่มีข้อความ ฉันเพิ่งเพิ่มลงในไฟล์ AppDelegate.m
@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
PS - (ฉันไม่รู้ว่าจะทำให้ส่วนขยายนี้ทำงานกับ Swift ได้อย่างไร แต่มีข้อผิดพลาดแปลก ๆ ยินดีให้แก้ไขเพื่อเพิ่มเวอร์ชัน Swift)
override
อย่างรวดเร็ว คำถามที่น่าสนใจมาก
ฉันลองด้านบนและด้านล่าง แต่ไม่ได้ผล สิ่งนี้ใช้ได้ผลสำหรับฉัน:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
สิ่งเดียวที่ใช้งานได้โดยไม่มีผลข้างเคียงคือการสร้างปุ่มย้อนกลับที่กำหนดเอง ตราบเท่าที่คุณไม่ได้ให้การดำเนินการที่กำหนดเองแม้แต่ท่าทางสไลด์ก็ใช้งานได้
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
น่าเสียดายที่หากคุณต้องการให้ปุ่มย้อนกลับทั้งหมดไม่มีชื่อเรื่องใด ๆ คุณต้องตั้งค่าปุ่มย้อนกลับที่กำหนดเองนี้ในตัวควบคุมมุมมองทั้งหมดของคุณ: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
เป็นเรื่องสำคัญมากที่คุณต้องตั้งค่าช่องว่างเป็นชื่อเรื่องไม่ใช่สตริงว่าง
เพื่อลบข้อความออกจากปุ่มย้อนกลับโดยทางโปรแกรมใช้ด้านล่างโค้ดซึ่งจะทำงานในรูปแบบ xcode7 ขึ้นไป
self.navigationController.navigationBar.topItem.title = @ "";
หรือ
manualLy ในสตอรีบอร์ดเลือกแถบนำทางบนตัวควบคุมมุมมองและใส่ "" ในข้อความปุ่มย้อนกลับ
สิ่งนี้จะได้ผล ขอบคุณ
self.navigationController?.navigationBar.topItem?.title = " "
ใน Xcode 9 และใช้งานได้!
คำตอบปัจจุบันใช้ไม่ได้ ฉันต้องการลบชื่อทั้งหมด แต่ข้อความ "ย้อนกลับ" ก็ยังไม่หายไป
กลับไปที่ตัวควบคุมมุมมองก่อนหน้าและตั้งค่าคุณสมบัติหัวเรื่อง:
self.title = @" ";
ใช้งานได้เฉพาะเมื่อ View Controller ก่อนหน้านี้ไม่มีชื่อเรื่อง
@""
.
ทางเลือกอื่น - ใช้คลาส NavigationBar ที่กำหนดเอง
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()
}
}
นั่นคือการลบกลับชื่อโครงการทั้งหมด เพียงตั้งค่าคลาสที่กำหนดเองสำหรับ UINavigationController
ตั้งชื่อของสตริง VC ก่อนหน้าเป็น "" ด้วยช่องว่าง และชื่อเรื่องที่มีปุ่มย้อนกลับจะถูกแทนที่ด้วยสตริงเว้นวรรคเดียว
Self.title = " "
เปิดกลับกดรีเซ็ตชื่อเรื่องเป็นต้นฉบับอีกครั้งใน viewWillAppear
ใช้แบบกำหนดเองNavigationController
ที่ลบล้าง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)
}
}
มีคำตอบมากมายแล้วนี่คือสองเซ็นต์ของฉันในหัวข้อนี้ ฉันพบว่าแนวทางนี้แข็งแกร่งจริงๆ คุณต้องใส่สิ่งนี้ไว้ใน viewController ก่อนทำต่อ
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
ฉันพยายามทุกอย่างในโพสต์นี้ ทางออกเดียวที่ใช้งานได้คือ @ VoidLess's
นี่คือคำตอบเดียวกัน แต่สมบูรณ์กว่า
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)
}
}
นี่คือความละเอียดของฉันสำหรับ iOS11 ฉันเปลี่ยนรูปลักษณ์ของ UIBarButtonItem ใน applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
คุณไม่สามารถเปลี่ยน Y offset ได้เพราะมันจะเปลี่ยนตำแหน่งของปุ่มแถบด้านหลังเช่นกันใน iOS11 แต่ใช้ได้ใน iOS10 และต่ำกว่า
Swift 3.1 คุณสามารถทำได้โดยใช้วิธีการมอบหมายของ 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
}
ใน Swift3
หากคุณตั้งค่าส่วนกลาง
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)
// ...
}
สำหรับผู้ที่ต้องการซ่อนชื่อปุ่มย้อนกลับทั่วโลก
คุณสามารถ swizzle viewDidLoad
ของUIViewController
เช่นนี้
+ (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);
}
}
การใช้งาน:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
ฉันกำลังดิ้นรนกับเรื่องนี้เพราะฉันมีตัวควบคุมการนำทางที่กำหนดเอง ฉันสามารถลบข้อความรายการด้านหลังในตัวควบคุมมุมมองทั้งหมดด้วยรหัสนี้ในคลาสตัวควบคุมการนำทางที่กำหนดเองของฉัน
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
สิ่งนี้จะลบชื่อรายการด้านหลังทั้งหมดโดยใช้ตัวควบคุมการนำทางแบบกำหนดเองนี้
หากคุณกำหนดเป้าหมายiOS 13และหลังจากนั้นคุณสามารถใช้API ใหม่นี้จะซ่อนชื่อปุ่มย้อนกลับทั่วโลก
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
ใน iOS 11 เราพบว่าการตั้งค่าUIBarButtonItem
แบบอักษร / สีข้อความของลักษณะที่ปรากฏเป็นค่าที่น้อยมากหรือสีที่ชัดเจนจะส่งผลให้รายการแถบอื่นหายไป (ระบบไม่ให้เกียรติคลาสของรายการ UIBarButton อีกต่อไปมันจะแปลงเป็น_UIModernBarButton
) นอกจากนี้การตั้งค่าออฟเซ็ตของข้อความด้านหลังเป็นปิดหน้าจอจะส่งผลให้กะพริบระหว่างป๊อปโต้ตอบ
ดังนั้นเราจึงหมุน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];
}
ข้อความกลับมาจากที่ผ่านมาดูผู้ควบคุมnavigationItem.title
และมีการตั้งค่าโดยอัตโนมัติโดยnavigationItem.title
self.title
วิธีง่ายๆในการแก้ปัญหาคือขอsetTitle:
ให้แน่ใจnavigationItem.title = @""
ใส่รหัสนี้AppDelegate.m
จะทำให้ใช้ได้。
[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];
รายละเอียดเพิ่มเติมที่https://www.jianshu.com/p/071bc50f1475(Simple Chinease)
วิธีแก้ปัญหาของฉัน: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
วิธีที่ง่ายมากแม้ว่าอาจจะเป็นวิธีแฮ็คเล็กน้อยในการทำโปรแกรมหากคุณไม่ต้องการปุ่มย้อนกลับที่กำหนดเองคือการตั้งค่าขนาดตัวอักษรให้เท่ากับศูนย์ในตัวควบคุมมุมมองที่คุณกำลังผลักดันไปที่กองซ้อนเรียกสิ่งนี้ จาก 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
}
ในที่สุดก็พบโซลูชันที่สมบูรณ์แบบในการซ่อนข้อความด้านหลังเริ่มต้นในแอปทั้งหมด
เพียงเพิ่มภาพโปร่งใสหนึ่งภาพและเพิ่มรหัสต่อไปนี้ใน AppDelegate ของคุณ
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
วิธีการต่อไปนี้ใช้ได้กับ iOS 11 และปลอดภัยที่จะไม่เกิดปัญหากับ iOS เวอร์ชันอื่น ๆ การทำเช่นนี้อาจทำให้แอปของคุณถูกปฏิเสธในการตรวจสอบ App Store เนื่องจากทั้ง UIModernBarButton และ UIBackButtonContainerView เป็น API ส่วนตัว วางใน 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)
}
นี่มาจากรหัส xamarin.forms ของฉันคลาสมาจาก NavigationRenderer
NavigationBar.Items.FirstOrDefault().BackBarButtonItem = new UIBarButtonItem( "", UIBarButtonItemStyle.Plain, null);