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
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)];
Ajouter une contrainte dans IB fera également l'affaire:
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];
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".
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
}
}
}
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
.
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.
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.
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)
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
)
)
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);
}
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
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.