Stworzyłem pasek narzędzi w IB z kilkoma przyciskami. Chciałbym móc ukryć / pokazać jeden z przycisków w zależności od stanu danych w oknie głównym.
UIBarButtonItem
nie ma ukrytej właściwości, a wszelkie przykłady, które do tej pory ukryłem, obejmują ustawienie przycisków paska nawigacyjnego na zero, co nie wydaje mi się, że chcę to zrobić tutaj, ponieważ może być konieczne ponowne wyświetlenie przycisku (nie wspomnieć, że jeśli podłączę przycisk do IBOutleta, jeśli ustawię go na zero, nie jestem pewien, jak go odzyskam).
ios
uibarbuttonitem
uitoolbar
Sasha
źródło
źródło
Odpowiedzi:
Zapisz swój przycisk w silnym gniazdku (nazwijmy go
myButton
) i zrób to, aby go dodać / usunąć:Ponieważ jest przechowywany w gnieździe, zachowasz odniesienie do niego, nawet jeśli nie ma go na pasku narzędzi.
źródło
Wiem, że na to pytanie spóźnia się odpowiedź. Może to jednak pomóc, jeśli ktoś stanie w podobnej sytuacji.
W iOS 7, aby ukryć element przycisku paska, możemy użyć następujących dwóch technik: -
SetTitleTextAttributes
: - Działa to świetnie na elementach przycisku paska, takich jak „Gotowe”, „Zapisz” itp. Jednak nie działa na elementach takich jak Dodaj, Symbol kosza itp. (przynajmniej dla mnie), ponieważ nie są to teksty.TintColor
: - Jeśli mam element przycisku paska o nazwie „deleteButton”: -Aby ukryć przycisk, użyłem następującego kodu:
Aby ponownie wyświetlić przycisk, użyłem następującego kodu:
źródło
deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()
wyłączanie i ukrywanie orazdeleteButton.enabled = true; deleteButton.tintColor = nil
ponowne włączanie i wyświetlanie w normalny sposób.UIColor.clear
dlaUIControlState.disabled
i może pokazać / ukryć przycisk zsetEnabled
. Oczywiście, jak powiedziałeś, działa to tylko w przypadku przycisków tekstowych.Oto proste podejście:
Właśnie uruchomiłem go na iPadzie z siatkówką, a .01 jest wystarczająco mały, aby się nie pojawił.
źródło
self.window?.tintColor = APP_PRIMARY_COLOR
w appdelegate, to nie zadziałaMożna ukryć przycisk na miejscu bez zmiany jego szerokości lub usunięcia go z paska. Jeśli ustawisz styl na zwykły, usuniesz tytuł i wyłączysz przycisk, zniknie. Aby go przywrócić, po prostu cofnij zmiany.
źródło
Poniżej znajduje się moje rozwiązanie, chociaż szukałem go dla paska nawigacji.
Tutaj „navBar” to IBOutlet do paska nawigacji w widoku w XIB Tutaj chciałem ukryć przycisk lub pokazać go na podstawie pewnych warunków. Więc testuję warunek w warunku „If” i jeśli true, ustawiam przycisk na zero w metodzie viewDidLoad widoku docelowego.
Może to nie dotyczyć dokładnie twojego problemu, ale coś podobnego, jeśli chcesz ukryć przyciski na pasku nawigacji
źródło
rightBarButtonItem
ponownie, upewnij się, że element przycisku jest przechowywany w silnym IBOutletu, aby nie został zwolniony po zdjęciu go z paska nawigacji.W przypadku Swift 3 i Swift 4 możesz to zrobić, aby ukryć
UIBarButtomItem
:I aby pokazać
UIBarButtonItem
:Na
tintColor
musisz określić kolor pochodzenia, którego używasz dlaUIBarButtomItem
źródło
Obecnie używam OS X Yosemite Developer Preview 7 i Xcode 6 beta 6 ukierunkowanych na iOS 7.1 i następujące rozwiązanie działa dla mnie dobrze:
UINavigationItem
iUIBarButtonItem
sUruchom następujący kod, aby go usunąć
Uruchom następujące kody, aby ponownie dodać przyciski
źródło
W moim projekcie wykorzystałem IBOutlety. Więc moim rozwiązaniem było:
A kiedy będziesz musiał ponownie wyświetlić ten pasek, po prostu ustaw właściwości odwrócone.
W Swift 3 zamiast tego
enable
użyjisEnable
właściwości.źródło
self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
źródło
iOS 8. UIBarButtonItem z niestandardowym obrazem. Próbowałem na wiele różnych sposobów, większość z nich nie pomagała. Rozwiązanie Maxa
setTintColor
nie zmieniło się na żaden kolor. Sam to wymyśliłem, myślałem, że przyda się komuś.Do ukrywania:
Do pokazania:
źródło
Wypróbuj w Swift , nie aktualizuj,
tintColor
jeśli masz jakiś projekt UIBarButtonItem, taki jak rozmiar czcionki w AppDelegate, to całkowicie zmieni wygląd twojego przycisku podczas wyświetlania.W przypadku przycisku tekstowego zmiana tytułu może sprawić, że przycisk „zniknie”.
źródło
Odkryłem kolejne zmarszczki
tintColor
iisEnabled
podejście sugerowane przez Maxa i innych - gdy VoiceOver jest włączony dla ułatwienia dostępu, a przycisk jest logicznie ukryty, kursor dostępności nadal będzie się skupiał na przycisku paska i oznajmił, że jest „przyciemniony” (tj. PonieważisEnabled
jest ustawiono na false). Podejście w zaakceptowanej odpowiedzi nie cierpi z powodu tego efektu ubocznego, ale inną pracą, którą znalazłem, było ustawienie wartościisAccessibilityElement
false podczas „ukrywania” przycisku:A potem
isAccessibilityElement
powrót do wartości „pokazywania” przycisku:Utrzymywanie miejsca na przycisku paska na pasku nadal nie stanowiło problemu w moim przypadku, ponieważ ukrywaliśmy / pokazywaliśmy skrajnie lewe elementy przycisku na pasku.
źródło
A teraz po prostu zmień
isHidden
właściwość.źródło
Poprawa z odpowiedzi @lnafziger
Zapisz swoje Barbuttons w silnym gniazdku i zrób to, aby je ukryć / pokazać:
W razie potrzeby skorzystaj z funkcji poniżej.
źródło
Wystarczy ustawić
barButton.customView = UIView()
i zobaczyć lewęźródło
Nie ma sposobu, aby „ukryć” UIBarButtonItem, musisz usunąć go z superView i dodać z powrotem, gdy chcesz go ponownie wyświetlić.
źródło
Jest to długa lista odpowiedzi, ale na wypadek, gdyby ktoś chciał łatwo skopiować i wkleić szybkie rozwiązanie, oto
źródło
Jednym ze sposobów jest skorzystanie z
initWithCustomView:(UIView *)
właściwości przy przydzielaniuUIBarButtonItem
. Podklasa dlaUIView
będzie miała właściwość ukryj / pokaż.Na przykład:
1. Mają coś,
UIButton
co chcesz ukryć / odkryć.2. Ustaw
UIButton
jako widok niestandardowy. Lubić :3. Możesz ukryć / odkryć
myButton
utworzony przez siebie.[myButton setHidden:YES];
źródło
W przypadku wersji Swift oto kod:
Dla
UINavigationBar
:źródło
Ustawienie koloru tekstu na wyraźny kolor, gdy element przycisku paska jest wyłączony, jest prawdopodobnie czystszą opcją. Nie ma dziwności, którą musisz wyjaśnić w komentarzu. Ponadto nie niszczysz przycisku, więc nadal zachowujesz powiązane sekwencje scenariuszy.
Jeśli chcesz ukryć element przycisku paska, możesz po prostu:
To kiepskie, że nie ma ukrytej własności, ale daje to ten sam rezultat.
źródło
W przypadku, gdy UIBarButtonItem zawiera obraz zamiast tekstu, możesz to zrobić, aby go ukryć:
navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;
źródło
Niektóre metody pomocnicze, które pomyślałem, że podzielę się w oparciu o zaakceptowaną odpowiedź lnafziger, ponieważ mam wiele pasków narzędzi i wiele przycisków w każdym:
źródło
Możesz łatwo uzyskać widok i ukryć go w ten sposób
źródło
Jeśli używasz Swift 3
źródło
Oto rozszerzenie, które sobie z tym poradzi.
STOSOWANIE:
źródło
Uzupełniając odpowiedź Eli Burke'a, jeśli
UIBarButtonItem
zamiast tytułu masz obraz w tle, możesz użyć kodu:źródło
Musisz manipulować tablicą toolbar.items.
Oto kod, którego używam do ukrywania i wyświetlania przycisku Gotowe. Jeśli przycisk znajduje się na skrajnej krawędzi paska narzędzi lub pomiędzy innymi przyciskami, pozostałe przyciski będą się poruszać, więc jeśli chcesz, aby Twój przycisk zniknął, umieść go jako ostatni przycisk w kierunku środka. Animuję ruch przycisku, aby uzyskać efekt, całkiem mi się podoba.
}
więc teraz możesz użyć następującego kodu, aby wyświetlić przycisk
lub aby ukryć swój przycisk
źródło
W IB, jeśli pozostawisz tytuł przycisku pusty, nie pojawi się (nigdy nie zainicjowany?). Robię to często podczas opracowywania podczas aktualizacji interfejsu użytkownika, jeśli chcę, aby element przycisku paska zniknął w przypadku kompilacji bez usuwania go i usuwania wszystkich odniesień do gniazd.
Nie ma to takiego samego efektu w czasie wykonywania, ustawienie tytułu przycisku na zero nie spowoduje, że cały przycisk zniknie. Niestety tak naprawdę nie odpowiada na twoje pytanie, ale może być przydatne dla niektórych.
Edycja: Ta sztuczka działa tylko wtedy, gdy styl przycisku jest ustawiony na zwykły
źródło
Dodam tutaj moje rozwiązanie, ponieważ nie mogłem go tutaj znaleźć. Mam przycisk dynamiczny, którego obraz zależy od stanu jednej kontrolki. Najprostszym rozwiązaniem było ustawienie obrazu,
nil
jeśli kontrola nie była obecna. Obraz był aktualizowany za każdym razem, gdy kontrolka była aktualizowana, a zatem było to dla mnie optymalne. Dla pewności ustawiłem równieżenabled
naNO
.Ustawienie minimalnej wartości szerokości nie działało w systemie iOS 7.
źródło
Z podziękowaniami dla @lnafziger, @MindSpiker, @vishal i in. glin,
Najprostszym linerem, do którego dotarłem dla pojedynczego prawego (lub lewego) przycisku paska jest:
Jak w:
Przetestowałem to i działa dla mnie (z silnym elementem przycisku przewodowego podłączonym przez IB).
źródło