web-dev-qa-db-fra.com

iOS: change la hauteur de UISegmentedcontrol

J'essaie de modifier la hauteur de UISegmentedcontrol, mais cela n'est pas autorisé dans Interface Builder. Est-il possible de changer ou est-ce impossible?

Merci

64
DavidNg

Oui, vous pouvez utiliser [mySegmentedControl setFrame:frame] dans le code. Il est regrettable que vous ne puissiez pas faire cela dans IB.

Donc, si vous voulez juste changer la hauteur:

CGRect frame= mySegmentedControl.frame;
[mySegmentedControl setFrame:CGRectMake(frame.Origin.x, frame.Origin.y, frame.size.width, fNewHeight)];
83
Luke

Ajouter une contrainte dans IB fera également l'affaire:

Constraint in IB

142
Ji Fang

Ajoutez une nouvelle contrainte de hauteur et définissez sa valeur.

 enter image description here

24
naveed148

Si vous utilisez Auto Layout et rencontrez des problèmes avec la réponse de Luke , cela a parfaitement fonctionné pour moi:

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:mySegmentedControl
                                     attribute:NSLayoutAttributeHeight 
                                     relatedBy:NSLayoutRelationEqual
                                     toItem:nil
                                     attribute:NSLayoutAttributeNotAnAttribute
                                     multiplier:1 
                                     constant:fNewHeight];
[mySegmentedControl addConstraint:constraint];
12
jburns20

Pour le faire dans Interface Builder, vous pouvez sélectionner le contrôle et ajouter l'attribut frame sous "Attributs d'exécution définis par l'utilisateur".

add frame attribute inside IB

10
Shaz

La meilleure façon de procéder consiste à définir la contrainte de hauteur sur un contrôle segmenté et à augmenter sa valeur selon vos besoins.

 enter image description here

8
Arshad Shaik

Swift 3 IBInspectable Solution: 

@IBDesignable class MySegmentedControl: UISegmentedControl {

    @IBInspectable var height: CGFloat = 29 {
        didSet {
            let centerSave = center
            frame = CGRect(x: frame.minX, y: frame.minY, width: frame.width, height: height)
            center = centerSave
        }
    }
}
7
Kew Kylyu Vacquier

Heureusement, vous pouvez également changer la hauteur de xib.

Vous pouvez également le faire via la variable xib. Ajoutez simplement un contrôle de segment dans la xib. Ouvrez ensuite la xib dans TextEdit. Vous y trouverez le code:

<segmentedControl opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="B99-Tt-vJG">

<rect key="frame" x="222" y="82" width="123" height="44"/>

Ici, vous modifiez la hauteur de 44 à toute hauteur requise. Vous pouvez modifier la hauteur de toute variable UIConponent comme celle-ci. Même pour la UIPickerView.

4
NiKKi

Solution rapide:

segmentedControl.frame = CGRect(x: segmentedControl.frame.Origin.x, y: segmentedControl.frame.Origin.y, width: segmentedControl.frame.size.width, height: 40);

définit la hauteur du SegmentedControl sur 40.

2
datayeah

Il suffit d'aller à Storyboard où l'identifiant UisegmentContrrole est situé et de définir height contrainte avec votre coutume height comme 

 enter image description here

2
Rahul Panzade

Solution rapide:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    let rect = CGRect(Origin: segment.frame.Origin, size: CGSize(width: segment.frame.size.width, height: 100))
    segment.frame = rect
}

ou

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let rect = CGRect(Origin: segment.frame.Origin, size: CGSize(width: segment.frame.size.width, height: 100))
    segment.frame = rect
}

ou

    override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    let rect = CGRect(Origin: segment.frame.Origin, size: CGSize(width: segment.frame.size.width, height: 100))
    segment.frame = rect
}

Définit la hauteur du SegmentedControl sur 100. 

1
Anh Tuan

Il suffit de faire MySegmentedControl.frame = CGRectMake(15,5, 290, 50); et de changer les coordonnées pour l'adapter à votre vue (Ceci est mis à jour pour iOS 7)

0
Jacobanks

Vous pouvez essayer ce qui suit:

segmentedControll.addConstraint(
        NSLayoutConstraint(
            item: segmentedControll,
            attribute: NSLayoutAttribute.Height,
            relatedBy: NSLayoutRelation.Equal,
            toItem: nil,
            attribute: NSLayoutAttribute.NotAnAttribute,
            multiplier: 1,
            constant: 40.0
        )
    )
0
Duy linh Trần

La solution de Ji Fang n'a pas fonctionné pour moi. Je devais sous-classer le contrôle segmenté et ajouter ces méthodes. La solution basée sur la mise en page automatique n'est pas robuste sous iOS7.0/7.1. Parfois, il revient à la hauteur par défaut.

const static CGFloat kViewHeight = 35;

- (void) layoutSubviews {

    [super layoutSubviews];

    CGRect frame = self.frame;
    [self setFrame:CGRectMake(frame.Origin.x, frame.Origin.y, frame.size.width, kViewHeight)];

}

- (CGSize) intrinsicContentSize {

    CGSize defaultSize = [super intrinsicContentSize];
    return CGSizeMake(defaultSize.width, kViewHeight);
}
0
Vladimír Slavík

Si vous sélectionnez "Utiliser la disposition automatique", la réinitialisation du cadre ne fonctionne pas, vous devez plutôt modifier les contraintes. C'est peut-être la raison pour laquelle la meilleure réponse ne fonctionne pas pour quelqu'un, car elle est sélectionnée par défaut dans xcode 5

0
ken zhou

Pour moi, la solution était: -

CGRect frame = CGRectMake (20, 20, 180, 50);
self.segmentedControl.frame = frame;

Cela fonctionne dans toutes les versions et sans même utiliser le redimensionnement automatique.

0
iosDeveloper