Bagaimana cara menyembunyikan Teks Tombol Kembali dari Pengontrol UINavigasi? Saya hanya akan memiliki "<" dan bukan "<Back"
Bagaimana cara menyembunyikan Teks Tombol Kembali dari Pengontrol UINavigasi? Saya hanya akan memiliki "<" dan bukan "<Back"
Jawaban:
Di pembuat antarmuka , Anda dapat memilih item navigasi dari pengontrol sebelumnya dan mengubah Back Button
string ke tampilan tombol kembali yang Anda inginkan. Jika ingin kosong misalnya, beri spasi.
Anda juga dapat mengubahnya dengan baris kode ini:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Atau di Swift :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
sudah kosong di IB, tambahkan spasi untuk naik Back
dan tunjukkan panahnya.
Anda juga bisa melakukan ini melalui papan cerita. Dalam inspektur atribut item navigasi dari pengontrol sebelumnya, Anda dapat menyetel "" di bidang tombol Kembali. Lihat Gambar di bawah. Ganti "Judul Anda di sini" menjadi "". Dengan melakukan ini, Anda akan mencapai hasil yang diinginkan. Anda tidak perlu lagi mengotak-atik 'Judul'.
Secara terprogram Anda bisa menggunakan
[self.navigationItem.backBarButtonItem setTitle:@" "];
di mana self mengacu pada pengontrol yang mendorong pengontrol Tampilan yang Anda inginkan.
Sampel Sebelum, Setelah bilah Navigasi
Sebelum
Setelah
backBarButtonItem
terprogram tidak berfungsi, tetapi pengaturan melalui storyboard berfungsi.
backBarButtonItem
terprogram bekerja untuk saya di iOS 9.
Anda dapat menerapkan UINavigationControllerDelegate
seperti ini:
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
secara nil
default dan ini memengaruhi pengontrol yang didorong berikutnya, jadi Anda cukup menyetelnya untuk semua pengontrol
Menyetel judul tombol kembali ke @""
atau nil
tidak akan berfungsi. Anda perlu mengosongkan seluruh tombol (tanpa judul atau gambar):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Ini harus dilakukan pada pengontrol tampilan yang ada di atas pengontrol tampilan Anda di tumpukan navigasi (yaitu dari tempat Anda menavigasi ke VC melalui pushViewController
metode)
Solusi lain untuk masalah ini untuk situasi di mana Anda memiliki banyak pengontrol tampilan adalah dengan menggunakan UIAppearance
proxy untuk secara efektif menyembunyikan teks judul tombol kembali seperti ini:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Solusi ini akan membuat teks sebagai titik bening kecil, mirip dengan mengatur judul tombol kembali secara manual @" "
, kecuali bahwa hal itu mempengaruhi semua tombol bilah navigasi.
Saya tidak menyarankan ini sebagai solusi umum untuk masalah ini karena ini memengaruhi semua tombol bilah navigasi. Ini membalik paradigma sehingga Anda memilih kapan harus menampilkan judul tombol, daripada kapan menyembunyikan judul.
Untuk memilih kapan akan menampilkan judul, pulihkan atribut teks judul secara manual sesuai kebutuhan, atau buat subkelas khusus UIBarButtonItem
yang melakukan hal yang sama (berpotensi dengan UIAppearance
proxy lain ).
Jika Anda memiliki aplikasi yang sebagian besar judul tombol kembali perlu disembunyikan, dan hanya beberapa (atau tidak ada) tombol navigasi yang merupakan tombol sistem dengan judul, ini mungkin cocok untuk Anda!
(Catatan: perubahan ukuran font diperlukan meskipun warna teksnya jelas untuk memastikan bahwa judul yang panjang tidak menyebabkan judul bilah navigasi tengah bergeser)
Tambahkan kode berikut di viewDidLoad atau loadView
self.navigationController.navigationBar.topItem.title = @"";
Saya mengujinya di iPhone dan iPad dengan iOS 9
Anda dapat menambahkan kategori Objective-C ini agar semua tombol "Kembali" yang dibuat oleh pengontrol navigasi tidak memiliki teks. Saya baru saja menambahkannya ke file AppDelegate.m saya.
@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 - (Saya tidak tahu cara membuat ekstensi ini berfungsi dengan Swift, ada kesalahan yang aneh. Pengeditan boleh menambahkan versi Swift)
override
dengan cepat. Pertanyaan yang sangat menarik
Saya mencoba beberapa di atas dan di bawah tetapi tidak berhasil. Ini berhasil untuk saya:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
Satu-satunya hal yang berfungsi tanpa efek samping adalah membuat tombol kembali kustom. Selama Anda tidak memberikan tindakan kustom, bahkan gerakan slide berfungsi.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Sayangnya, jika Anda ingin semua tombol kembali tidak memiliki judul, Anda perlu mengatur tombol kembali khusus ini di semua pengontrol tampilan Anda: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Sangat penting untuk Anda menetapkan spasi sebagai judul dan bukan string kosong.
untuk menghapus Teks dari tombol belakang secara terprogram, gunakan di bawah Kode ini akan berfungsi dari xcode7 ke atas.
self.navigationController.navigationBar.topItem.title = @ "";
atau
manualLy di papan cerita, pilih bilah navigasi di pengontrol tampilan dan letakkan "" di teks tombol kembali.
ini akan berhasil. Terima kasih
self.navigationController?.navigationBar.topItem?.title = " "
di Xcode 9 dan berhasil!
Jawaban saat ini tidak berfungsi. Saya ingin menghapus judul seluruhnya, namun teks "kembali" tidak menghilang.
Kembali ke pengontrol tampilan sebelumnya dan setel properti judulnya:
self.title = @" ";
HANYA berfungsi jika View Controller sebelumnya tidak memiliki judul
@""
.
Cara alternatif - gunakan kelas NavigationBar kustom.
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()
}
}
Artinya, ini menghapus kembali judul seluruh proyek. Cukup setel kelas khusus untuk UINavigationController.
Setel Judul VC Sebelumnya menjadi string "" dengan spasi. dan judul dengan tombol kembali akan diganti dengan string spasi tunggal.
Self.title = " "
On Back tekan lagi setel ulang judul ke yang asli di viewWillAppear.
Gunakan kebiasaan NavigationController
yang menggantikanpushViewController
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)
}
}
Sudah banyak jawaban, inilah dua sen saya untuk masalah ini. Saya menemukan pendekatan ini sangat kuat. Anda hanya perlu meletakkan ini di viewController sebelum segue.
Cepat 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Saya mencoba semuanya di posting ini. Satu-satunya solusi yang berfungsi adalah @ VoidLess
Ini jawabannya sama tapi lebih lengkap
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)
}
}
Ini adalah resolusi saya untuk iOS11, saya mengubah tampilan UIBarButtonItem di applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Anda tidak dapat mengubah offset Y, karena itu akan mengubah posisi tombol bar belakang juga di iOS11, tetapi tidak masalah di iOS10 dan di bawahnya.
Di Swift3,
Jika Anda mengatur pengaturan global
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 Anda dapat melakukan ini dengan mengimplementasikan metode delegasi 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
}
Bagi mereka yang ingin menyembunyikan judul tombol kembali secara global.
Anda dapat Swizzle viewDidLoad
dari UIViewController
seperti ini.
+ (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);
}
}
Pemakaian:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Jika Anda menargetkan iOS 13 dan yang lebih baru, Anda dapat menggunakan API baru ini untuk menyembunyikan judul tombol kembali secara global .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
Saya berjuang dengan ini karena saya memiliki pengontrol navigasi khusus. Saya dapat menghapus teks item belakang di semua pengontrol tampilan dengan kode ini di kelas pengontrol navigasi kustom saya
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Ini menghapus semua judul item belakang menggunakan pengontrol navigasi kustom ini.
Di iOS 11, kami menemukan bahwa mengatur UIBarButtonItem
font / warna teks tampilan ke nilai yang sangat kecil atau warna yang jelas akan mengakibatkan item bar lain menghilang (sistem tidak menghormati kelas item UIBarButton lagi, itu akan mengubahnya menjadi a _UIModernBarButton
). Juga mengatur offset teks belakang ke offscreen akan menghasilkan flash selama pop interaktif.
Jadi kami bingung 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];
}
Teks belakang berasal dari View Controller terakhir navigationItem.title
, dan navigationItem.title
secara otomatis diatur oleh self.title
. Cara termudah untuk memecahkan masalah ini adalah dengan hook setTitle:
, pastikannavigationItem.title = @""
Letakkan kode ini di AppDelegate.m
akan membuatnya ok。
[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];
Detail lebih lanjut di https://www.jianshu.com/p/071bc50f1475(Simple Chinease)
Solusi saya: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Cepat 5
Cara yang sangat sederhana - meskipun mungkin sedikit hacky - untuk melakukan ini secara terprogram jika Anda tidak memerlukan tombol kembali kustom adalah dengan mengatur ukuran font sama dengan nol di pengontrol tampilan yang Anda dorong ke tumpukan, memanggil sesuatu seperti ini dari 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
}
Akhirnya menemukan solusi sempurna untuk menyembunyikan teks belakang default di seluruh aplikasi.
Cukup tambahkan satu Gambar transparan dan tambahkan kode berikut di AppDelegate Anda.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Metode berikut berfungsi di iOS 11 dan aman untuk tidak mogok di versi iOS lainnya. Melakukan hal ini dapat membuat aplikasi Anda ditolak dalam peninjauan App Store karena UIModernBarButton dan UIBackButtonContainerView adalah API pribadi. Tempatkan di 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)
}
Versi Swift, bekerja dengan sempurna secara global:
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
. Seperti yang ditunjukkan @limfinity, itu akan mengubahnya secara universal untuk semua UIBarButtonItem di seluruh aplikasi