2011-11-22 17 views
10

UIToolbar में UIBarButtonItem के x, y स्थान को निर्धारित करने का सबसे आसान तरीका क्या है?UIToolbar में UIBarButtonItem की स्थिति कैसे निर्धारित करें?

मुझे मिला एकमात्र उत्तर any way to know where uibarbuttonitem has been drawn में मिला है।

सभी प्रस्तावित उत्तर बहुत जटिल लगते हैं। लापरवाही UIBarButtonItem की स्थिति पाने के लिए एक आसान तरीका होना चाहिए?

उत्तर

12

दुर्भाग्य से, UIBarButtonItem की स्थिति निर्धारित करने का कोई आसान तरीका नहीं है। एक UIBarButtonItem अनिवार्य रूप से एक NSObject है जो केवल दो चीजें करता है: टूलबार बटन के स्वरूप और अनुभव का वर्णन करें, और नामित लक्ष्य/क्रिया चयनकर्ता को आगे की घटनाओं का वर्णन करें।

अब, यह देखते हुए कि सभी बटन UIToolbar की subviews हैं, और सभी बटन घटनाओं उनके संबंधित UIBarButtonItems के माध्यम से रूट रहे हैं, यह पाश करने के लिए काफी तुच्छ अपने UIToolbar के सभी subviews के माध्यम से है और जब आप एक बटन जिसका लक्ष्य अपने UIBarButtonItem का है लगता है बस उस बटन का फ्रेम प्राप्त करें। कुछ कोड:

UIToolbar *toolbar = <your toolbar>; 
UIBarButtonItem *barButtonItem = <your item>; 
UIButton *button = nil; 
for (UIView *subview in toolbar.subviews) { 
    if ([subview isKindOfClass:[UIButton class]]) { 
     for (id target in [(UIButton *)subview allTargets]) { 
      if (target == barButtonItem) { 
       button = (UIButton *)subview; 
       break; 
      } 
     } 
     if (button != nil) break; 
    } 
} 
CGRect frame = button.frame; 
+0

यह आईओएस 5 में मेरे लिए काम नहीं करता प्रतीत होता है। – Jon

+4

यह यूआईकंट्रोल के साथ यूआईबटन को प्रतिस्थापित करता है तो यह काम करता है। –

+0

UIButton को UIControl में बदलने के लिए संपादित उत्तर। –

0
UIToolbar *toolbar; 

for (UIView *v in [toolbar items]) 
{ 
    if ([v isKindOfClass:[UIBarButtonItem class]]) 
    { 
     UIBarButtonItem *b = (UIBarButtonItem*)v; 
     //do something with b.. 
    } 
} 
+0

क्या यह स्थिति निर्धारित करने के प्रश्न का उत्तर देता है? यह अपमानजनक प्रतीत नहीं होता है। – corsiKa

+0

अभी तक नहीं .. लेकिन आप UIBarButtonItem //toolbar.subviews तक काम नहीं कर सकते हैं // उत्तर – morex87

17

मैं इस प्रयोग किया जाता है जो लगता है सबसे खूबसूरत तरीका

- (CGRect)frameForBarButtonItem:(UIBarButtonItem *)buttonItem 
{ 
    UIView *view = [buttonItem valueForKey:@"view"]; 
    return view ? view.frame : CGRectZero; 
} 
+0

को सुधारने की कोशिश करें – Husam

+1

स्वीकार किया जाना चाहिए यह आईओएस 11 – Sree

6

यह मेरे लिए काम करता है जब UIBarButtonItems से बनाया जाता है का उपयोग कर सकता है।

- (void)buttonClicked:(id)sender{ 
{ 
    CGRect buttonRect = [[sender view] frame]; 
} 
2

मैंने स्विफ्ट का उपयोग करके UIBarButtonItem की स्थिति प्राप्त करने के लिए जोहोशेर के दृष्टिकोण का उपयोग किया।

चूंकि मुझे पॉपओवर प्रस्तुति नियंत्रक के लिए SourceRect के रूप में स्थिति की आवश्यकता थी, मुझे इसे स्वयं .view में परिवर्तित करना पड़ा। मुझे यकीन नहीं है, चाहे यह एक अच्छा समाधान है लेकिन यह बहुत अच्छी तरह से काम करता है और पॉपओवर UIBarButtonItem के दाईं ओर दिखाता है।

let senderRect = sender.view!!.convertRect(sender.view!!.bounds, toView: self.view) 

// additional code for the popover controller 
alertController.modalPresentationStyle = UIModalPresentationStyle.Popover 
alertController.popoverPresentationController?.sourceRect = senderRect 
alertController.popoverPresentationController?.sourceView = self.view 
+0

में काम नहीं कर रहा है धन्यवाद, यह स्विफ्ट 2.0 के साथ सही काम करता है –

2

एक और अधिक 'Swifty' स्विफ्ट रास्ता:

func userAction(sender: AnyObject) { 
    if let originView = sender.valueForKey("view") { 
     let frame = originView.frame //it's a UIBarButtonItem 
    } else { 
     let frame = sender.frame //it's a regular UIButton 
    } 
} 

UIBarButtonItem हालांकि यह अनिवार्य रूप से एक बटन है UIView का एक उपवर्ग नहीं है। जाओ पता लगाओ।