मैं UINavigation नियंत्रक से बैक बटन पाठ कैसे छिपा सकता हूं? मेरे पास केवल "<" होगा और "<पीछे" नहीं होगा
मैं UINavigation नियंत्रक से बैक बटन पाठ कैसे छिपा सकता हूं? मेरे पास केवल "<" होगा और "<पीछे" नहीं होगा
जवाबों:
इंटरफ़ेस बिल्डर में , आप पिछले नियंत्रक के नेविगेशन आइटम का चयन कर सकते हैं और Back Button
स्ट्रिंग को बदल सकते हैं जिसे आप बैक बटन के रूप में दिखाना चाहते हैं। यदि आप इसे खाली करना चाहते हैं, उदाहरण के लिए, बस एक जगह रखो।
आप इसे इस लाइन कोड के साथ बदल भी सकते हैं :
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
या स्विफ्ट में :
self.navigationItem.backBarButtonItem?.title = ""
Back Button
आईबी में पहले से ही रिक्त है, तो बस सवारी करने के लिए एक स्थान जोड़ें Back
और बस तीर दिखाएं।
आप स्टोरीबोर्ड के माध्यम से भी ऐसा कर सकते हैं। पिछले नियंत्रक के नेविगेशन आइटम की विशेषता निरीक्षक में आप बैक बटन फील्ड में "" सेट कर सकते हैं। नीचे इमेज देखें। "आपका शीर्षक यहाँ" को "" में बदलें। ऐसा करने से आप वांछित परिणाम प्राप्त करेंगे। अब आपको 'शीर्षक' के साथ गड़बड़ करने की आवश्यकता नहीं है।
प्रोग्रामेटिक रूप से आप उपयोग कर सकते हैं
[self.navigationItem.backBarButtonItem setTitle:@" "];
जहां स्व नियंत्रक को संदर्भित करता है जो आपके इच्छित दृश्य नियंत्रक को धक्का देता है।
नेविगेशन बार से पहले, नमूना
इससे पहले
उपरांत
backBarButtonItem
प्रोग्रामेटिक रूप से सेट करना काम नहीं करता है, लेकिन इसे स्टोरीबोर्ड के माध्यम से सेट करना है।
आप 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)
इसे नेविगेशन स्टैक में आपके व्यू कंट्रोलर के ऊपर स्थित व्यू कंट्रोलर पर किया जाना चाहिए (यानी जहाँ से आप अपने वीसी को 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 = @"";
मैंने आईफोन 9 के साथ आईफोन और आईपैड में इसका परीक्षण किया
आप इस उद्देश्य-सी श्रेणी को जोड़ सकते हैं ताकि नेविगेशन नियंत्रक द्वारा बनाए गए सभी "बैक" बटन में कोई पाठ न हो। मैंने अभी इसे अपनी 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 - (मैं नहीं जानता कि स्विफ्ट के साथ इस विस्तार कार्य को कैसे बनाया जाए, इसमें अजीब त्रुटियां थीं। स्विफ्ट को जोड़ने के लिए संपादन का स्वागत है)
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 = @ "";
या
स्टोरीबोर्ड में मैनुअलली, व्यू कंट्रोलर पर नेविगेशन बार चुनें और बैक बटन टेक्स्ट में "" डालें।
यह काम करेगा। धन्यवाद
self.navigationController?.navigationBar.topItem?.title = " "
Xcode 9 में और काम किया!
वर्तमान उत्तर काम नहीं कर रहा था। मैं शीर्षक को पूरी तरह से हटाना चाहता था , फिर भी पाठ "वापस" नहीं जा रहा था।
पिछले दृश्य नियंत्रक पर वापस जाएं और उसकी शीर्षक संपत्ति सेट करें:
self.title = @" ";
केवल तभी काम करता है जब पिछले व्यू कंट्रोलर के पास कोई शीर्षक न हो
@""
:।
वैकल्पिक तरीका - कस्टम नेविगेशनबार वर्ग का उपयोग करें।
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 के लिए बस कस्टम वर्ग सेट करें।
पिछली वीसी का शीर्षक अंतरिक्ष के साथ "" स्ट्रिंग पर सेट करें। और बैक बटन के साथ शीर्षक को सिंगल स्पेस स्ट्रिंग से बदल दिया जाएगा।
Self.title = " "
बैक प्रेस पर फिर से टाइटल को फिर से देखने के लिए ऑरिजनल में रीसेट करें।
एक कस्टम का उपयोग करें 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)
}
}
पहले से ही बहुत सारे उत्तर, यहाँ इस विषय पर मेरे दो सेंट हैं। मैंने इस दृष्टिकोण को वास्तव में मजबूत पाया। आपको बस seog से पहले viewController में डालने की जरूरत है।
स्विफ्ट 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 की उपस्थिति को बदल देता हूं ।DidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
आप Y ऑफ़सेट को नहीं बदल सकते, क्योंकि यह बैक बार बटन की स्थिति को iOS11 में भी बदल देगा, लेकिन यह iOS10 और नीचे में ठीक है।
स्विफ्ट 3 में,
अगर आप ग्लोबल सेटिंग करते हैं
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)
// ...
}
स्विफ्ट 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
}
उन लोगों के लिए जो विश्व स्तर पर बैक बटन शीर्षक छिपाना चाहते हैं।
आप एक प्रकार का शराबी कर सकते हैं 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;
}
यदि आप iOS 13 को लक्षित कर रहे हैं और बाद में आप इस नए एपीआई का उपयोग विश्व स्तर पर बैक बटन शीर्षक छिपाने के लिए कर सकते हैं ।
let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
मैं इसके साथ संघर्ष कर रहा था क्योंकि मेरे पास एक कस्टम नेविगेशन नियंत्रक था। मैं अपने कस्टम नेविगेशन नियंत्रक वर्ग में इस कोड के साथ सभी दृश्य नियंत्रकों में बैक आइटम टेक्स्ट को हटाने में सक्षम था
override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
यह इस कस्टम नेविगेशन कंट्रोलर का उपयोग करके बैक आइटम के सभी शीर्षक हटाता है।
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];
}
पिछला पाठ अंतिम व्यू कंट्रोलर के text से आता है navigationItem.title
और navigationItem.title
स्वचालित रूप से सेट होता है self.title
। समस्या को हल करने का इतना आसान तरीका हुक है way setTitle:
सुनिश्चित करेंnavigationItem.title = @""
इस कोड को रखो AppDelegate.m
यह ठीक हो जाएगा will
[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 पर अधिक जानकारी https:// सरल चिनाई)
मेरा समाधान: - XCode: 10.2.1 - स्विफ्ट: 5
XCode 11.5 स्विफ्ट 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 संस्करणों पर क्रैश नहीं करने के लिए सुरक्षित है। 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)
}
स्विफ्ट संस्करण, पूरी तरह से विश्व स्तर पर काम करता है:
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 ने कहा है, यह इसे UIBarButtonItem के सभी ऐप के लिए सार्वभौमिक रूप से बदल देगा