2014-10-28 14 views
21

Mam UINavigationItem na moim kontrolerze widoku i staram się zmniejszyć odstępy między moimi dwoma RightBarButtonItems. Oto niektóre z moich kodu:Zmiana odstępu między UIBarButtonItems w iOS 8

// Create two UIBarButtonItems 
    let item1:UIBarButtonItem = UIBarButtonItem(customView: view1) 
    let item2:UIBarButtonItem = UIBarButtonItem(customView: view2) 

    var fixedSpace:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil) 
    fixedSpace.width = -20.0 

    // Add the rightBarButtonItems on the navigation bar 
    viewController.navigationItem.rightBarButtonItems = [item2, fixedSpace, item1] 

Jak widać, używam FixedSpace UIBarButtonItem, ale to nie zmienia odstępy dla jakiegoś powodu. Myślałem o podklasowaniu UINavigationItem lub UIBarButtonItem, aby odpowiednio ustawić odstępy, ale nie mogłem znaleźć żadnych metod, które mogłem zastąpić, aby zmienić odstępy między elementami.

Jakikolwiek wgląd w sposób rozwiązania tego problemu byłby bardzo cenny!

Odpowiedz

18

Dzięki pomocy @ Fogmeister, zorientowałem się, że szerokość obiektów view1 i view2, które są UIButtons, była zbyt duża. Dlatego między nimi zachodziła nienormalna odległość. Tu jest mój ostateczny kod:

// Get the first button's image 
    var view1Img:UIImage = UIImage(named: "Image1")! 

    // Create the first button 
    var view1:UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: view1Img.size.width, height: view1Img.size.height)) 

    // Get the second button's image 
    var view2Img:UIImage = UIImage(named: "Image2")! 

    // Create the second button 
    var view2:UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: view2Img.size.width, height: view2Img.size.height)) 

    // Create two UIBarButtonItems 
    let item1:UIBarButtonItem = UIBarButtonItem(customView: view1) 
    let item2:UIBarButtonItem = UIBarButtonItem(customView: view2) 

    // Set 26px of fixed space between the two UIBarButtonItems 
    var fixedSpace:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil) 
    fixedSpace.width = 26.0 

    // Set -7px of fixed space before the two UIBarButtonItems so that they are aligned to the edge 
    var negativeSpace:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil) 
    negativeSpace.width = -7.0 

    // Add the rightBarButtonItems on the navigation bar 
    viewController.navigationItem.rightBarButtonItems = [negativeSpace, item2, fixedSpace, item1] 

tworzę obraz tła dla pierwszego UIButton a następnie użyć jej rozmiar, aby utworzyć ramkę dla tego UIButton. Wykonuję te same czynności dla drugiego UIButton. Następnie tworzę UIBarButtonItems z dwóch UIButtons. Następnie tworzę 26px przestrzeni stacjonarnej, a następnie -7.0px przestrzeni stacjonarnej. Celem tego pierwszego jest stworzenie pewnej przestrzeni między dwoma przyciskami. Celem tego ostatniego jest przeniesienie wszystkich znaków UIBarButtonItems w prawo. Następnie dodaje wszystkie UIBarButtonItems jako rightBarButtonItems w określonej kolejności, więc mam wygląd, który chcę.

Działa teraz świetnie! Dzięki za całą pomoc, Fogmeister!

5

Z docs for UIBarButtonItem...

enter image description here

Jeżeli wartość wynosi 0,0 lub ujemny, element wyznacza szerokość połączonego obrazu i tytule w montażu.

Po ustawieniu szerokości na -20.0 zignoruje ją i użyje standardowej szerokości.

Co to jest, co i tak próbujesz osiągnąć przy ujemnej szerokości? Jestem niemal pewien, że będzie lepszy sposób.

+0

Dzięki za odpowiedź, Fogmeister! Przyjrzałem się innym pytaniom SO na ten temat, a zalecanym rozwiązaniem było dodanie ujemnego stałego odstępu między dwoma obiektami UIBarButton, aby zlikwidować lukę między nimi. Moim celem jest zmniejszenie dopełnienia między item1 i item2, ale nic, co znalazłem online, nie pomogło. – Alexander

+0

Co stanie się, jeśli w ogóle nie dodasz miejsca o stałej szerokości? Po prostu dodaj przycisk 1 i przycisk 2 bez spacji. – Fogmeister

+0

Za dużo miejsca między tymi dwoma elementami, jeśli w ogóle nie dodaję miejsca o stałej szerokości. – Alexander

11

Innym sposobem jest po prostu zmiana lewej i prawej wstawki obrazu w IB.

enter image description here

+1

To zostało zgłoszone gdzie indziej na stackoverflow, że to przesuwa obraz wizualnie, ale nie porusza się tapable obszar odpowiadający wizualnej zmianie. Nie zweryfikowałem tej wady osobiście; zalecamy testowanie, aby upewnić się, że kliknięcia w dowolnym miejscu przycisku nadal działają, szczególnie w przypadku dużego przesunięcia. – ToolmakerSteve

+0

Dlaczego prawo to -23? –