2011-09-01 35 views
7

OK đây là một điều kỳ lạ. Tôi đã đập đầu của tôi chống lại nó trong một giờ bây giờ cố gắng để gỡ lỗi.UIBarButtonItem với chế độ xem tùy chỉnh không hiển thị sau khi xem lần đầu tiên

Tôi đã tạo UIBarButtonItem với chế độ xem tùy chỉnh, là UIButton có hình ảnh được gán cho nó. Mã này là như sau

UIButton *btnAdd = [[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 28, 28)] autorelease]; 

[btnAdd setImage:[UIImage imageNamed:@"btn_add"] forState:UIControlStateNormal]; 

[btnAdd addTarget:self 
      action:@selector(addBox) 
forControlEvents:UIControlEventTouchUpInside]; 

UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithCustomView:btnAdd]; 

self.navigationItem.rightBarButtonItem = add; 

Nó nằm ở phương pháp - (id)initWithNibName: của tôi trên một UIViewController mở rộng

On sự xuất hiện đầu tiên của UIViewController, nút xuất hiện như bình thường, và hoạt động tốt. BAO GIỜ, nếu tôi đẩy đến một bộ điều khiển xem khác, và sau đó nhấn trở lại, nút là KHÔNG THỂ.

Ngay cả khi nó ẩn, nút vẫn hoạt động. Tôi có thể nhấp vào nó và nó hoạt động bình thường. Tôi biết thực tế đó là UIButton gốc ở đó, vì tôi đã thực hiện các dấu vết trên địa chỉ bộ nhớ của nó và các thuộc tính khác ... tài sản ẩn của nó là FALSE và thuộc tính alpha của nó được đặt thành 1.00f

Tôi nghĩ lúc đầu, điều này có lẽ là một vấn đề sâu sắc, nhưng tôi có mã đẩy nền UINavigationBar tùy chỉnh của tôi ở mặt sau trên mọi vòng lặp khung và không có gì thay đổi. XEM CẬP NHẬT

Nó gần giống như hình ảnh được phát hành hoặc một cái gì đó đằng sau hậu trường, nhưng con trỏ vào đó cũng là tốt ...

Tôi đoán đây là một số những đứa vẽ kỳ lạ mà tôi chỉ cần khỉ xung quanh với, nhưng đó là một vấn đề rất khó để google cho.

Mọi gợi ý sẽ được đánh giá cao.

CẬP NHẬT

Hóa ra đây là một vấn đề chiều sâu. Tôi vẽ một nền tùy chỉnh trên drawRect :, và mã DOES đẩy nền tùy chỉnh vào mặt sau của khung nhìn, TUYỆT ĐỜI, phương pháp này chỉ được gọi một lần bằng các phương pháp khung riêng ... do đó khi thanh được vẽ lại sau xem đầu tiên, nền không bị buộc phải quay lại và vì một lý do ngu ngốc nào đó, nó quyết định vẽ lại các nút phía sau nó.

Vì vậy, ngay bây giờ tôi đang cố gắng tìm ra cách tôi có thể buộc nền được đẩy trở lại mỗi khi UINavigationBar được hiển thị.

+0

Tốt hơn nên thêm các nút vào thanh điều hướng của bạn trong 'viewDidLoad'. Hãy thử điều này trước. Và cố gắng thiết lập hình ảnh đó cho tất cả các trạng thái UIButton. – Nekto

+0

Tôi thực sự vui vì tôi đã tìm thấy điều này, tôi sẽ trải qua chính xác điều tương tự. Các giải pháp dưới đây không cảm thấy phù hợp với tôi, và giống như hack hơn. Nhưng nếu bạn đã tìm ra người bạn đời này, tôi rất thích nhìn thấy những gì bạn đã làm. – n00shie

Trả lời

2

thử Like This Fine công việc của mình With Me

UIImage *image = [UIImage imageNamed:@"btn_set-as-fea.png"]; 
    UIImage *hilghtedImage=[UIImage imageNamed:@"btn_set-as-fea_h.png"]; 
    CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height); 

    UIButton* someButton = [[UIButton alloc] initWithFrame:frame]; 
    [someButton addTarget:self action:@selector(SetAsFeatured) forControlEvents:UIControlEventTouchUpInside]; 
    [someButton setBackgroundImage:image forState:UIControlStateNormal]; 
    [someButton setBackgroundImage:hilghtedImage forState:UIControlStateHighlighted]; 
    [someButton setShowsTouchWhenHighlighted:YES]; 
    setAsFeatured = [[UIBarButtonItem alloc] initWithCustomView:someButton]; 
0

Ngày xửa ngày xưa, tôi đã đi máng với nỗi đau tương tự. Và tôi đã thực hiện theo sau, giải pháp vĩnh viễn và hoạt động hoàn hảo ...

btnAdd là UIButton và bạn có thể đặt vị trí mong muốn bằng cách đặt x và y của nó.

- (void)viewDidLoad 
    { 
     btnAdd = [UIButton buttonWithType:UIButtonTypeCustom]; 
     btnAdd.frame = CGRectMake(250, 6, 61, 30); 
     [btnAdd setImage:[UIImage imageNamed:@"btnAdd.png"] forState:UIControlStateNormal]; 
     btnAdd.backgroundColor = [UIColor clearColor]; 
     [self.navigationController.navigationBar addSubview:btnAdd]; 
     [btnAdd addTarget:self action:@selector(btnAdd_clicked:) forControlEvents: UIControlEventTouchUpInside]; 
    } 
    - (void)viewWillAppear:(BOOL)animated 
    { 
     [btnAdd setHidden:FALSE]; 
    } 
    - (void)viewWillDisappear:(BOOL)animated 
    { 
     [btnAdd setHidden:TRUE];  
    } 
    - (void) btnAdd_clicked 
    { 
     // Your logic... 
    } 
0

Bạn nên thử với điều này link. Nó cho phép gửi hình ảnh tùy chỉnh quay lại khi có bất kỳ điều hướng nào trên bộ điều khiển điều hướng.

0

Vì bạn đang nói rằng UINavigationBar là đằng sau nền hệ thống, bạn có thể sử dụng

[UIView bringSubviewToFront:barName]; 

để đưa nó vào phía trước, hoặc

[UIView sendSubviewToBack:background]; 

để gửi nền xuống đáy khung nhìn.

0

Gọi điện thoại setNeedsDisplay có ảnh hưởng gì không? Đặc biệt là liên quan đến bản cập nhật nơi bạn đang tạo nền tùy chỉnh với drawRect?

setNeedsHiển thị thường cần thiết nếu bạn cần cập nhật màn hình cho bất kỳ đại diện thay đổi nào, thường thông qua các thay đổi đối với drawRect.

0

Trong trường hợp của tôi, tôi sử dụng bố trí ô tô suốt ứng dụng của tôi, và đã viết một nút tùy chỉnh nơi tôi có dòng sau trong constructor:

button.setTranslatesAutoresizingMaskIntoConstraints(false) 

Khi tôi cố gắng sử dụng nút này như giao diện tùy chỉnh của tôi cho UIBarButtonItem nó không vẽ.

Ngắn câu chuyện ngắn, đảm bảo rằng translatesAutoResizingMaskIntoConstraints được đặt thành true.

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