2011-11-22 34 views
10

Cách dễ nhất để xác định vị trí x, y của UIBarButtonItem trong thanh công cụ UIToolbar là gì?Cách xác định vị trí của UIBarButtonItem trong UIToolbar?

Câu trả lời duy nhất tôi tìm thấy là trong any way to know where uibarbuttonitem has been drawn.

Tất cả các câu trả lời được đề xuất có vẻ quá phức tạp. Có phải là một cách đơn giản hơn để có được vị trí của UIBarButtonItem chết tiệt không có ở đó?

Trả lời

12

Thật không may, không có cách nào dễ dàng để xác định vị trí của UIBarButtonItem. Một UIBarButtonItem về bản chất là một NSObject chỉ làm hai việc: mô tả giao diện của một nút trên thanh công cụ và các sự kiện chuyển tiếp tới bộ chọn mục tiêu/hành động được chỉ định. Bây giờ, cho rằng tất cả các nút là subviews của UIToolbar, và tất cả các sự kiện nút được định tuyến thông qua UIBarButtonItems tương ứng, nó khá tầm thường để lặp qua tất cả các subviews của UIToolbar của bạn và khi bạn tìm thấy một nút có mục tiêu là của UIBarButtonItem của bạn , chỉ cần lấy khung của nút đó. Một số mã:

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

Điều này dường như không hoạt động đối với tôi trong iOS 5. – Jon

+4

Nó hoạt động nếu bạn thay thế UIButton bằng UIControl. –

+0

Câu trả lời đã chỉnh sửa để thay đổi UIButton thành UIControl. –

0
UIToolbar *toolbar; 

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

Điều này có trả lời câu hỏi xác định vị trí không? Nó không có vẻ như trái phép. – corsiKa

+0

Chưa .. Nhưng bạn có thể truy cập vào UIBarButtonItem //toolbar.subviews không hoạt động // cố gắng cải thiện câu trả lời – morex87

17

Tôi sử dụng này mà dường như là cách thanh lịch nhất

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

Nên được chấp nhận – Husam

+1

nó không hoạt động ở ios 11 – Sree

6

này làm việc cho tôi khi sử dụng popovers từ UIBarButtonItems.

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

Tôi đã sử dụng cách tiếp cận của johosher để nhận vị trí của UIBarButtonItem bằng Swift.

Vì tôi cần vị trí là sourceRect cho popoverPresentationController, tôi phải chuyển đổi nó thành self.view. Tôi không chắc chắn, cho dù đây là một giải pháp tốt nhưng nó hoạt động rất tốt và cửa sổ bật lên cho thấy quyền của 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

cảm ơn bạn, điều này hoạt động hoàn hảo với Swift 2.0 –

2

A 'Swifty' cách SWIFT hơn:

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 KHÔNG phải là một lớp con của UIView mặc dù nó thực chất là một nút. Đi con số.

Các vấn đề liên quan