2011-09-01 12 views
7

OK, to jest dziwne. Tłukąłem się o to głową przez godzinę, próbując debugować.UIBarButtonItem z niestandardowym widokiem nie wyświetla się po pierwszym wyświetleniu

Utworzono UIBarButtonItem z niestandardowym widokiem, który jest UIButton z przypisanym obrazem. Kod jest następujący

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; 

Znajduje się w moim sposobie - (id)initWithNibName: na dłuższy UIViewController

na pierwszym wyglądem UIViewController, przycisk pojawia się jako normalne i działa dobrze. JEDNAKŻE, jeśli popchnę do innego kontrolera widoku, a następnie uderzę ponownie, przycisk jest NIEWIDZIALNY.

Nawet jeśli jest niewidoczny, przycisk nadal działa. Mogę go kliknąć i zachowuje się normalnie. Wiem, że jest to oryginalny UIButton, ponieważ zrobiłem ślady na jego adresie pamięci i innych właściwościach ... jego ukryta własność to FALSE, a jej właściwość alpha jest ustawiona na 1.00f

Myślałem na początku był to prawdopodobnie problem z głębiami, ale mam kod przesuwający moje niestandardowe tło UINavigationBar do tyłu w każdej pętli ramki i nic się nie zmienia. Zobacz Aktualizacja

To prawie jak obraz jest zwolnienie lub coś za kulisami, ale wskaźnik na który też jest w porządku ...

Zgaduję to jest trochę dziwne dziwactwo rysowania że wystarczy małpa z, ale jest to bardzo trudny problem dla Google.

Wszelkie wskazówki będą mile widziane.

UPDATE

Okazuje się, że jest to kwestia głębokości. Rysuję niestandardowe tło dla funkcji drawRect :, a kod ten PRZEKONUJE niestandardowe tło do tyłu stosu widoków, JEDNAKĄ ta metoda jest wywoływana tylko raz przez prywatne metody ramowe ... dlatego, gdy pasek jest przerysowywany po pierwszy widok, tło nie jest cofane i z jakiegoś głupiego powodu, postanawia przerysować przyciski za nim.

W tej chwili staram się dowiedzieć, w jaki sposób mogę wymusić wypychanie tła za każdym razem, gdy renderowany jest pasek UINavigationBar.

+0

Lepiej jest dodać przyciski do paska nawigacji w 'viewDidLoad'. Wypróbuj to pierwsze. I spróbuj ustawić ten obraz do wszystkich stanów UIButton. – Nekto

+0

Naprawdę cieszę się, że znalazłem to, przechodzę dokładnie to samo. Poniższe rozwiązania nie wydają mi się odpowiednie i bardziej przypominają hacki. Ale jeśli już to wymyśliłeś, bardzo chciałbym zobaczyć, co zrobiłeś. – n00shie

Odpowiedz

2

spróbować Like This nią grzywny ze mną pracować

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

Dawno, dawno temu, ja bym poszedł koryto z tym samym bólem. I zaimplementowałem następujące, stałe rozwiązanie i to działa idealnie ...

btnAdd to UIButton i można ustawić żądaną lokalizację, ustawiając jej xiy.

- (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

Należy starać z tym link. Pozwala przesłać niestandardowy obraz do tyłu, gdy istnieje dowolna nawigacja na kontrolerze nawigacyjnym.

0

Skoro mówisz, że jest za UINavigationBar tle, można użyć

[UIView bringSubviewToFront:barName]; 

w celu dostosowania go do przodu, lub

[UIView sendSubviewToBack:background]; 

wysłać tło do dołu stos widoków.

0

Czy wywołanie setNeedsDisplay ma jakiś wpływ? Zwłaszcza jeśli chodzi o aktualizację, w której tworzysz niestandardowe tło z drawRect?

setNeedsDisplay jest zwykle potrzebny, jeśli chcesz zaktualizować wyświetlacz do dowolnych zmienionych reprezentacji, zwykle poprzez zmiany na drawRect.

0

W moim przypadku używam układ automatycznego całej mojej aplikacji, i napisał niestandardowego przycisku gdzie mam następujący wiersz w konstruktorze:

button.setTranslatesAutoresizingMaskIntoConstraints(false) 

Kiedy próbowałem za pomocą tego przycisku jako mojego widoku niestandardowego dla osób UIBarButtonItem nie narysował.

Krótko mówiąc, upewnij się, że translatesAutoResizingMaskIntoConstraints jest ustawione na true.

Powiązane problemy