web-dev-qa-db-fra.com

Modifier l'espacement entre UIBarButtonItems dans iOS 8

J'ai un UINavigationItem sur mon contrôleur de vue, et j'essaie de réduire l'espacement entre mes deux RightBarButtonItems. Voici une partie de mon code:

// 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]

Comme on peut le voir, j'utilise un FixedSpace UIBarButtonItem, mais cela ne change pas l'espacement pour une raison quelconque. J'ai pensé à sous-classer le UINavigationItem ou le UIBarButtonItem afin de pouvoir définir l'espacement en conséquence, mais je n'arrivais pas à trouver de méthodes que je pouvais remplacer pour changer l'espacement entre les éléments .

Toute idée sur la façon de résoudre ce problème serait grandement appréciée!

25
Alexander

Grâce à l'aide de @ Fogmeister, j'ai compris que la largeur du view1 et view2 objets, qui sont UIButtons, était trop volumineux. C'est pourquoi il y avait un espacement anormal entre eux. Voici mon code final:

// 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]

Je crée l'image d'arrière-plan pour le premier UIButton puis j'utilise sa taille pour créer le cadre pour ce UIButton. J'exécute les mêmes actions pour le deuxième UIButton. Ensuite, je crée UIBarButtonItems à partir des deux UIButtons. Après cela, je crée 26 pixels d'espace fixe, puis -7,0 pixels d'espace fixe. Le premier a pour but de créer un certain espace entre les deux boutons. Le but de ce dernier est de déplacer tous les UIBarButtonItems vers la droite. Ensuite, j'ajoute tous les UIBarButtonItems en tant que rightBarButtonItems dans un ordre particulier afin d'obtenir le look que je veux.

Cela fonctionne très bien maintenant! Merci pour toute l'aide, Fogmeister!

23
Alexander

Une autre méthode consiste simplement à modifier l'encart d'image gauche et droit dans IB.

enter image description here

11
zzzel

De la docs pour UIBarButtonItem ...

enter image description here

Si la valeur est 0,0 ou négative , l'élément définit la largeur de l'image et du titre combinés pour s'adapter.

Si vous définissez la largeur sur -20.0 il l'ignorera et utilisera la largeur standard.

Qu'est-ce que vous essayez de faire avec une largeur négative de toute façon? Je suis presque certain qu'il y aura une meilleure façon.

6
Fogmeister