2011-11-24 22 views
20

पर केंद्रित है मेरे पास प्रत्येक तरफ बाएं और दाएं बार बटन दोनों के साथ नेविगेशनबार है। मेरे पास customTitlelabel है जिसे मैंने UINavigationItem के शीर्षक दृश्य के रूप में सेट किया है।UINavigationItem शीर्षक

[self.navigationItem setTitleView: customTitleLabel];

सब ठीक है। समस्या, दाएंबार का आकार बटन एक टेक्स्ट फ़ील्ड में प्राप्त इनपुट के आधार पर गतिशील है।

इसलिए शीर्षक स्वचालित रूप से बटन के बीच उपलब्ध स्थान के आधार पर केंद्रित होता है।

मैं शीर्षक को एक निश्चित स्थिति में कैसे सेट कर सकता हूं?

उत्तर

15

आप जो भी सीधे चाहते हैं वह नहीं कर सकते हैं - आपके शीर्षक दृश्य की स्थिति आपके नियंत्रण से बाहर है (जब UINavigationBar द्वारा प्रबंधित की जाती है)।

हालांकि, वहाँ कम से कम दो रणनीतियों प्रभाव आप चाहते हैं पाने के लिए कर रहे हैं:

1) नहीं नेविगेशन बार की 'उचित' शीर्षक दृश्य के रूप में शीर्षक दृश्य जोड़े, लेकिन UINavigationBar की एक subview के रूप। (ध्यान दें: यह 'आधिकारिक तौर पर' स्वीकृत नहीं है, लेकिन मैंने इसे देखा है, और काम करते हैं। जाहिर है आपको बटन के अपने शीर्षक लेबल ओवरराइटिंग बिट्स के लिए देखना होगा, और अलग-अलग ओरिएंटेशन आदि के लिए विभिन्न आकार के एनएवी बारों को संभालना होगा। - थोड़ा सा झुकाव।)

2) एक बुद्धिमान UIView सबक्लास बनाएं जो एक दिए गए सबव्यू (जो आपका यूआईएलएबल होगा) प्रदर्शित करता है, जो स्क्रीन पर केंद्रित पूरी तरह से सबव्यूव को प्रभावी ढंग से दिखाने के लिए गणना की जाती है। ऐसा करने के लिए, आपका बुद्धिमान UIView सबक्लास लेबल सबव्यूव की स्थिति (frame) को बदलकर लेआउट ईवेंट (या frame संपत्ति परिवर्तन इत्यादि) का जवाब देगा।

व्यक्तिगत रूप से, मुझे दृष्टिकोण 2 का विचार पसंद है) सबसे अच्छा।

28

शीर्षक सेट करना नौसेना बार की दृश्य दृश्य ठीक काम करता है - आपके कस्टम व्यू के अलावा किसी भी फ्रेम को उपclass या बदलने की आवश्यकता नहीं है।

यह UINavigationBar के समग्र चौड़ाई के सापेक्ष केंद्रित हो रही करने के लिए चाल के लिए है:

  1. पाठ
  2. के आकार के अनुसार आपके विचार की चौड़ाई सेट करने के लिए संरेखण सेट केंद्रित और
  3. autoresizingmask सेट तो यह उपलब्ध स्थान

यहाँ का आकार बदला जाता है कि एक लेबल जो UINa में केंद्रित होकर रह गयी साथ एक कस्टम titleView बनाता है कुछ उदाहरण कोड है vigationBar उन्मुखीकरण पर ध्यान दिए बिना, बाएं या दाएं barbutton चौड़ाई:

self.title = @"My Centered Nav Title"; 

// Init views with rects with height and y pos 
CGFloat titleHeight = self.navigationController.navigationBar.frame.size.height; 
UIView *titleView = [[UIView alloc] initWithFrame:CGRectZero]; 
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 

// Set font for sizing width 
titleLabel.font = [UIFont boldSystemFontOfSize:20.f]; 

// Set the width of the views according to the text size 
CGFloat desiredWidth = [self.title sizeWithFont:titleLabel.font 
          constrainedToSize:CGSizeMake([[UIScreen mainScreen] applicationFrame].size.width, titleLabel.frame.size.height) 
           lineBreakMode:UILineBreakModeCharacterWrap].width; 

CGRect frame; 

frame = titleLabel.frame; 
frame.size.height = titleHeight; 
frame.size.width = desiredWidth; 
titleLabel.frame = frame; 

frame = titleView.frame; 
frame.size.height = titleHeight; 
frame.size.width = desiredWidth; 
titleView.frame = frame; 

// Ensure text is on one line, centered and truncates if the bounds are restricted 
titleLabel.numberOfLines = 1; 
titleLabel.lineBreakMode = UILineBreakModeTailTruncation; 
titleLabel.textAlignment = NSTextAlignmentCenter; 

// Use autoresizing to restrict the bounds to the area that the titleview allows 
titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 
titleView.autoresizesSubviews = YES; 
titleLabel.autoresizingMask = titleView.autoresizingMask; 

// Set the text 
titleLabel.text = self.title; 

// Add as the nav bar's titleview 
[titleView addSubview:titleLabel]; 
self.navigationItem.titleView = titleView; 
+1

मैं भी यह दो लाइन के साथ काम किया टाइटल एक छोटा फ़ॉन्ट और नंबरऑफलाइन = 2 सेट करते हैं जब शीर्षक की लंबाई 25 वर्णों से बड़ी होती है। इस तरह आपके पास एक बहु-पंक्ति शीर्षक लेबल है। –

+1

इसके अलावा, यह कहना भूल गया कि 'वांछित विड्थ' की गणना में कोड को 'titleLabel.frame.size.height' की बजाय 'शीर्षक हाइट' का संदर्भ देना चाहिए, जो' CGRectZero' निर्माण के कारण शून्य होगा। –

+0

महान जवाब! मुझे एक टन समय बचाया – Julius

2

मैं aopsfan का जवाब करने की कोशिश की, लेकिन यह काम नहीं किया। एक ब्रेकपॉइंट ने खुलासा किया कि बार का केंद्र "(480.0, 22.0)" था (एक्स समन्वय रास्ता बंद)।

तो मैं इसे इस में बदल:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    // Center Title View 

    UINavigationItem* item = [self topItem]; // (Current navigation item) 

    [item.titleView setCenter:CGPointMake(160.0, 22.0)]; 
    // (...Hard-coded; Assuming portrait iPhone/iPod touch) 

} 

... और यह एक आकर्षण की तरह काम करता है।दृश्य नियंत्रकों को दबाते समय स्लाइड/फीका प्रभाव बरकरार है। (आईओएस 5.0)

0

मेरे पास ऐसी ही स्थिति थी जहां titleView यूआईएनविगेशनबार में केंद्रित होना चाहिए। मुझे UIView subclassing और setFrame: ओवरराइड करने के मौलिक दृष्टिकोण के बारे में पसंद है। फिर, मैं फ्रेम को UINavigationBar के आयामों के अंदर केंद्रित कर सकता हूं।

UIView उपवर्ग में:

-(void)setFrame:(CGRect)frame{ 
    super.frame = CGRectMake(320/2 - 50, 44/2 - 15, 100, 30); 
} 

UIView उपवर्ग तो प्रत्येक navigationItem के लिए titleView को सामान्य रूप से सौंपा जा सकता है। डेवलपर को UINavigationBar से विशेष सबव्यूज़ को प्रोग्रामेटिक रूप से जोड़ने और निकालने की आवश्यकता नहीं है।

3

सही उत्तर sizeThatFits: को अपने कस्टम titleView से ओवरराइड करना है और इसकी सामग्री का आकार वापस करना है। नेविगेशन बार कस्टम शीर्षक दृश्य को तब तक केंद्रित करता है जब तक कि उसके पास ऐसा करने के लिए कोई स्थान नहीं छोड़ा जाता है।

उदाहरण के लिए आप UILabel अंदर के साथ UIView कंटेनर अगर:

@interface CustomTitleView : UIView 

@property UILabel* textLabel; 

@end 

@implementation CustomTitleView 

- (CGSize)sizeThatFits:(CGSize)size { 
    CGSize textSize = [self.textLabel sizeThatFits:size]; 
    CGSize contentSize = size; 
    contentSize.width = MIN(size.width, textSize.width); 

    return contentSize; 
} 

@end 
+0

क्या आप अपना उत्तर स्पष्ट कर सकते हैं? ध्यान दें कि प्रश्न पूरी तरह से आवंटित स्थान के भीतर, संपूर्ण navbar चौड़ाई के सापेक्ष शीर्षक दृश्य को केंद्रित करने के बारे में है। – Ilya

11
override func viewDidLoad() { 
    super.viewDidLoad() 
    navigationController?.navigationBar.topItem?.title = "" 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    navigationItem.title = "Make peace soon" 
} 
+0

क्या आपको सच में लगता है कि यह समाधान बाएं और दाएं बटन की चौड़ाई के बावजूद नेविगेशन बार केंद्र पर पिन किया गया शीर्षक रखेगा? –

+0

मुझे नहीं पता कि यह क्यों काम करता है ... लेकिन यह करता है! अगर कोई समझा सकता है, तो इसकी सराहना की जाएगी। – th3hamburgler

+0

मुझे लगता है कि इसे देखने के जीवन चक्र के साथ करना है। viewDidLoad को ViewWillLayout से पहले बुलाया जाता है, इसलिए मूल रूप से वह इसे एक खाली स्ट्रिंग बनाता है जो कोई आकार नहीं लेता है। तो जब ViewWillLayout कहलाता है, तो यह शीर्षक को लगभग कुछ भी आकार देता है। फिर देखें में विल्लएपियर जो होता है लेआउट के बाद होता है, वह जोड़ता है कि वह वास्तव में क्या चाहता है। उसके बाद कोई रिलायट नहीं किया जाता है। –

1

मैं इसी तरह की समस्या थी। enter image description here मेरा समाधान मूल बैक बटन छुपाता है, अपना स्वयं का कार्यान्वयन जोड़ें। चूंकि सिस्टम बाएं आइटम के लिए जगह आरक्षित करेगा।

UIImage* cancelIcon = [UIImage imageNamed:@"ic_clear"]; 
UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] initWithImage:cancelIcon style:UIBarButtonItemStylePlain target:self action:@selector(back:)]; 

और चयनकर्ता सरल है

- (void)back:(UIButton *) sender 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

अब यह इस तरह दिखता है: enter image description here

ओह ... और अपने कस्टम शीर्षक दृश्य में autolayout उपयोग करने के लिए मत भूलना अगर आप इसमें लेबल की तरह गतिशील लंबाई सामग्री है। मैं customview में एक अतिरिक्त लेआउट जोड़ने यह "wrap_content" की तरह एंड्रॉयड में देने के लिए यह माता पिता के लिए केंद्रित की स्थापना, और प्रमुख और अंतरिक्ष अनुगामी द्वारा "> =" 0

enter image description here

संबंधित मुद्दे