ios - objective - swift segmented control change view
iOS: cambie la altura de UISegmentedcontrol (16)
Agregar una restricción en IB también hará el truco:
Estoy tratando de cambiar la altura del control UISegmented, pero no está permitido en el Interface Builder. ¿Hay alguna manera de cambiar o es imposible?
Gracias
La solución de Ji Fang no funcionó para mí. Tuve que subclasificar el control segmentado y agregar estos métodos. La solución basada en el diseño automático no es sólida en iOS7.0 /7.1. A veces salta a la altura predeterminada.
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);
}
Para hacerlo dentro de Interface Builder puede seleccionar el control y agregar el atributo de marco en "Atributos de tiempo de ejecución definidos por el usuario"
Para mí, la solución fue:
CGRect frame = CGRectMake (20, 20, 180, 50);
self.segmentedControl.frame = frame;
Funciona en todas las versiones y sin usar el ajuste automático.
Puedes probar lo siguiente:
segmentedControll.addConstraint(
NSLayoutConstraint(
item: segmentedControll,
attribute: NSLayoutAttribute.Height,
relatedBy: NSLayoutRelation.Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 1,
constant: 40.0
)
)
Si está utilizando el diseño automático y tiene problemas con la respuesta de Luke , esto funcionó perfectamente para mí:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:mySegmentedControl
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:fNewHeight];
[mySegmentedControl addConstraint:constraint];
Si selecciona "Usar diseño automático", el cuadro de restablecimiento no funciona, debe cambiar las restricciones en su lugar. Tal vez es la razón por la cual la mejor respuesta no funciona para alguien, porque está seleccionada por defecto en xcode 5
Solo haga MySegmentedControl.frame = CGRectMake(15,5, 290, 50);
y simplemente cambie las coordenadas para adaptarlas a su vista (Esto se actualiza para iOS 7)
Solución Swift:
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
}
o
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let rect = CGRect(origin: segment.frame.origin, size: CGSize(width: segment.frame.size.width, height: 100))
segment.frame = rect
}
o
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let rect = CGRect(origin: segment.frame.origin, size: CGSize(width: segment.frame.size.width, height: 100))
segment.frame = rect
}
Establece la altura de SegmentedControl en 100.
Solución Swift:
segmentedControl.frame = CGRect(x: segmentedControl.frame.origin.x, y: segmentedControl.frame.origin.y, width: segmentedControl.frame.size.width, height: 40);
establece la altura del SegmentedControl en 40.
Swift 3 Solución IBInspectable:
@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
}
}
}
Afortunadamente también puedes cambiar la altura del xib
.
Puedes hacerlo a través del xib
también. Solo agrega un control de segmento en el xib
. Luego abre el xib
en TextEdit. Ahí encontrarás el código:
<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"/>
Aquí cambia la altura de 44 a cualquier altura requerida. Puede cambiar la altura de cualquier UIConponent
como este. Incluso para UIPickerView
.
Sí, puede usar [mySegmentedControl setFrame:frame]
en el código. Es lamentable que no puedas hacer esto en IB.
Entonces, si solo quieres cambiar la altura:
CGRect frame= mySegmentedControl.frame;
[mySegmentedControl setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, fNewHeight)];