Geri Düğmesi Metnini bir UINavigation Controller'dan nasıl gizleyebilirim? Ben sadece "<" olacak, "<Geri" olmayacak
Geri Düğmesi Metnini bir UINavigation Controller'dan nasıl gizleyebilirim? Ben sadece "<" olacak, "<Geri" olmayacak
Yanıtlar:
Arayüz oluşturucuda , önceki denetleyicinin gezinme öğesini seçebilir ve Back Buttondizeyi geri düğmesinin görünmesini istediğiniz şekilde değiştirebilirsiniz . Örneğin boş olmasını istiyorsanız, sadece bir boşluk bırakın.
Bu kod satırıyla da değiştirebilirsiniz :
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Veya Swift ile :
self.navigationItem.backBarButtonItem?.title = ""
Back ButtonIB zaten boştur, sadece binmek almak için bir boşluk eklemek Backve sadece ok göstermektedir.
Bunu film şeridi aracılığıyla da yapabilirsiniz. Önceki denetleyicinin gezinme öğesinin öznitelik denetçisinde , Geri düğmesi alanında "" ayarını yapabilirsiniz. Aşağıdaki resme bakın. "Başlığınızı burada" "" olarak değiştirin. Bunu yaparak istediğiniz sonucu elde edersiniz. Artık 'Başlık' ile uğraşmanıza gerek yok.
Programlı olarak kullanabilirsiniz
[self.navigationItem.backBarButtonItem setTitle:@" "];
nerede self , istediğiniz View kontrol cihazını iten kontrol cihazını ifade eder.

Gezinme çubuğundan Önce, Sonra Örnek
Önce

Sonra

backBarButtonItemprogramlı olarak ayarlamak çalışmaz, ancak film şeridi aracılığıyla ayarlamak işe yarar.
backBarButtonItemprogramlı olarak benim için çalışıyor .
Şu şekilde uygulayabilirsiniz 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
}
}
backBarButtonItemolduğu nilvarsayılan olarak ve sadece tüm denetleyicileri için ayarlayın böylece bir sonraki, kontrolör itti etkiler
Geri düğmesinin başlığı çalışmıyor @""veya nilçalışmıyor. Tüm düğmeyi boş ayarlamanız gerekir (başlık veya resim olmadan):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Bu, gezinme yığınındaki görünüm denetleyicinizin üstündeki görünüm denetleyicisinde yapılmalıdır (yani pushViewControlleryöntem aracılığıyla sanal ortama gittiğiniz yerden )
Çok sayıda görüntü denetleyicisine sahip olduğunuz durumlar için bu soruna başka bir çözüm, aşağıdaki UIAppearancegibi geri düğmesi başlık metnini etkili bir şekilde gizlemek için bir proxy kullanmaktır :
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Bu çözüm, metni geri düğmesi başlığını manuel olarak @" " tüm gezinti çubuğu düğmelerini etkilemesi dışında .
Bunu soruna genel bir çözüm olarak önermiyorum çünkü tüm gezinti çubuğu düğmelerini etkiliyor. Başlıkları ne zaman gizlemek yerine düğme başlıklarının ne zaman gösterileceğini seçmeniz için paradigmayı ters çevirir .
Başlıkların ne zaman gösterileceğini seçmek için, başlık metni niteliklerini gerektiği gibi manuel olarak geri yükleyin veya UIBarButtonItemaynısını yapan özel bir alt sınıf oluşturun (potansiyel olarak başka birUIAppearance proxy ile).
Geri düğmesi başlıklarının çoğunun gizlenmesi gereken bir uygulamanız varsa ve gezinme düğmelerinin yalnızca birkaçı (veya hiçbiri) başlıklı sistem düğmeleriyse, bu sizin için olabilir!
(Not: Uzun başlıkların orta gezinme çubuğu başlığının kaymasına neden olmaması için metin rengi açık olsa bile yazı tipi boyutunun değiştirilmesi gerekir)
ViewDidLoad veya loadView'a aşağıdaki kodu ekleyin
self.navigationController.navigationBar.topItem.title = @"";
İPhone ve iPad'de iOS 9 ile test ettim
Bir gezinti denetleyicisi tarafından oluşturulan tüm "Geri" düğmelerinin metin içermemesi için bu Objective-C kategorisini ekleyebilirsiniz. Bunu AppDelegate.m dosyama ekledim.
@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
Not - (Bu uzantıyı Swift ile nasıl çalıştıracağımı bilmiyorum, tuhaf hatalar oluyordu. Düzenlemeler bir Swift sürümü eklemeye hoş geldiniz)
overridehızlı bir şekilde nasıl yapılır . Çok ilginç soru
Yukarıda ve aşağıda bazılarını denedim ama işe yaramadı. Bu benim için çalıştı:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
Hiçbir yan etki olmadan çalışan tek şey, özel bir geri düğmesi oluşturmaktır. Özel bir eylem sağlamadığınız sürece, slayt hareketi bile çalışır.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Maalesef, içindeki tüm geri düğmelerinin herhangi bir başlığa sahip olmamasını istiyorsanız, bu özel geri düğmesini tüm görünüm denetleyicilerinizde ayarlamanız gerekir: /
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Başlık olarak boş dize değil bir boşluk belirlemeniz çok önemlidir.
Metni arka düğmeden programlı olarak kaldırmak için, Kodun altında kullanıldığında bu, xcode7 ve üzerinde çalışacaktır.
self.navigationController.navigationBar.topItem.title = @ "";
veya
manuel: Görsel senaryo taslaklarında, görünüm denetleyicisindeki gezinme çubuğunu seçin ve geri düğmesi metnine "" koyun.
bu çalışacak. Teşekkürler
self.navigationController?.navigationBar.topItem?.title = " "Xcode 9'da düzenledim ve çalıştı!
Mevcut cevap işe yaramadı. Başlığı kaldırmak istedim tamamen , ancak "geri" metni kaybolmuyordu.
Önceki görünüm denetleyicisine geri dönün ve title özelliğini ayarlayın:
self.title = @" ";
YALNIZCA önceki Görünüm Denetleyicisinin bir başlığı olmadığında çalışır
@"".
Alternatif yol - özel NavigationBar sınıfını kullanın.
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()
}
}
Yani, bu tüm projenin başlıklarını geri alır. Sadece UINavigationController için özel sınıf ayarlayın.
Önceki VC'nin Başlığını boşluk içeren "" dizesine ayarlayın. ve geri düğmesi olan başlık, tek boşluklu dizeyle değiştirilecektir.
Self.title = " "
Geri'de düğmesine tekrar basın, başlığı görünümdeki orijinal başlığa sıfırlayın.
NavigationControllerGeçersiz kılan bir özel kullanınpushViewController
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)
}
}
Şimdiden bir çok cevap, işte konuyla ilgili iki sentim. Bu yaklaşımı gerçekten sağlam buldum. Bunu segmentten önce viewController'a koymanız yeterlidir.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Bu yazıdaki her şeyi denedim. Tek çalışan çözüm @ VoidLess's
İşte aynı cevap ama daha eksiksiz
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)
}
}
Bu benim iOS11 için çözümüm, applicationDidFinishLaunchingWithOptions içindeki UIBarButtonItem görünümünü değiştiriyorum:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Y ofsetini değiştiremezsiniz çünkü bu, iOS11'de de arka çubuk düğmesinin konumunu değiştirecektir, ancak iOS10 ve altı için sorun değil.
Swift3'te,
Global ayarı belirlerseniz
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 Bunu, UINavigationController'ın temsilci yöntemini uygulayarak yapabilirsiniz.
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
}
Global olarak geri düğmesi başlığını gizlemek isteyenler için.
Sen swizzle edebilirsiniz viewDidLoadait UIViewControllerböyle.
+ (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);
}
}
Kullanım:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
İOS 13 ve sonraki bir sürümü hedefliyorsanız , bu yeni API'yi geri düğmesi başlığını genel olarak gizlemek için kullanabilirsiniz .
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
Bununla mücadele ediyordum çünkü özel bir gezinme denetleyicim vardı. Özel gezinti denetleyicisi sınıfımdaki bu kodla tüm görünüm denetleyicilerindeki arka öğe metnini kaldırabildim
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Bu, bu özel gezinme denetleyicisini kullanarak tüm arka öğe başlıklarını kaldırır.
İOS 11'de, UIBarButtonItemgörünümün metin yazı tipini / rengini çok küçük bir değere veya net bir renge ayarlamanın, diğer çubuk öğelerinin kaybolmasına neden olacağını gördük (sistem artık UIBarButton öğesinin sınıfını onurlandırmıyor, onu bir_UIModernBarButton ). Ayrıca, arka metnin ofsetini ekran dışına ayarlamak, etkileşimli pop sırasında flaşla sonuçlanacaktır.
Biz de şaşkına döndük 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];
}
Arka metin, son Görüntü Denetleyicisinden navigationItem.title, gelir ve navigationItem.titleotomatik olarak ayarlanır self.title. Sorunu çözmenin bu kadar kolay yolu kancadır setTitle:, emin olunnavigationItem.title = @""
Bu kodu yerine koy AppDelegate.m, onu tamamlayacak。
[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];
Daha fazla ayrıntı https://www.jianshu.com/p/071bc50f1475(Simple Chinease)adresinde
Çözümüm: - XCode: 10.2.1 - Swift: 5
XCode 11.5 Swift 5
Özel geri düğmesine ihtiyacınız yoksa bunu programlı olarak yapmanın çok basit - belki de biraz hilekar - yolu, yığına ittiğiniz görünüm denetleyicisinde yazı tipi boyutunu sıfıra eşitlemektir ve böyle bir şey çağırmaktır. 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
}
Sonunda, tüm uygulamada varsayılan arka metni gizlemek için mükemmel bir çözüm buldu.
Sadece bir şeffaf Görüntü ekleyin ve AppDelegate'inize aşağıdaki kodu ekleyin.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Aşağıdaki yöntem iOS 11'de çalışır ve diğer iOS sürümlerinde kilitlenmemesi güvenlidir. Bunu yapmak, hem UIModernBarButton hem de UIBackButtonContainerView özel API'ler olduğundan uygulamanızın App Store incelemesinde reddedilmesine neden olabilir. AppDelegate'e yerleştirin.
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)
}
Swift versiyonu, global olarak mükemmel çalışıyor:
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. @Limfinity'nin işaret ettiği gibi, uygulama boyunca tüm UIBarButtonItem'ler için evrensel olarak değiştirecek