iphone - objective - swift segmented control change view
UISegmentedControl de texto con varias lĂneas? (5)
¿Cómo puedo hacer que el texto en uno de los botones de mi UISegmentedControl abarque varias líneas?
Años después...
for segment in segmented.subviews{
for label in segment.subviews{
if let labels = label as? UILabel{
labels.numberOfLines = 2
}
}
}
El enfoque anterior es mejor, pero para tener una alternativa, puedes hacer algo como:
for(UIView *subview in segmentedControl.subviews) {
if([NSStringFromClass(subview.class) isEqualToString:@"UISegment"]) {
for(UIView *segmentSubview in subview.subviews) {
if([NSStringFromClass(segmentSubview.class) isEqualToString:@"UISegmentLabel"]) {
UILabel *label = (id)segmentSubview;
label.numberOfLines = 2;
label.text = @"Hello/nWorld";
CGRect frame = label.frame;
frame.size = label.superview.frame.size;
label.frame = frame;
}
}
}
}
Lo hice de esta manera:
- crear una UILabel multilínea
- Rellena la etiqueta con N líneas de texto.
- convertir la etiqueta en un UIImage
- establece la imagen como un contenido de segmentos
Esto funciona sin problemas en iOS 4, 5, 6
y iOS 7 (solo quita la sombra del texto)
MultiLineSegmentedControl - archivo de cabecera
//
// MultiLineSegmentedControl.h
//
// Created by Jens Kreiensiek on 20.07.11.
// Copyright 2011 SoButz. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MultiLineSegmentedControl : UISegmentedControl
- (void)setMultilineTitle:(NSString *)title forSegmentAtIndex:(NSUInteger)segment;
@end
MultiLineSegmentedControl - archivo de implementación
//
// MultiLineSegmentedControl.m
//
// Created by Jens Kreiensiek on 20.07.11.
// Copyright 2011 SoButz. All rights reserved.
//
#import "MultiLineSegmentedControl.h"
#import "UIView+LayerShot.h"
@interface MultiLineSegmentedControl()
@property (nonatomic, retain) UILabel *theLabel;
@end
@implementation MultiLineSegmentedControl
@synthesize theLabel;
- (void)dealloc
{
self.theLabel = nil;
[super dealloc];
}
- (UILabel *)theLabel
{
if (!self->theLabel) {
self->theLabel = [[UILabel alloc] initWithFrame:CGRectZero];
self->theLabel.textColor = [UIColor whiteColor];
self->theLabel.backgroundColor = [UIColor clearColor];
self->theLabel.font = [UIFont boldSystemFontOfSize:13];
self->theLabel.textAlignment = UITextAlignmentCenter;
self->theLabel.lineBreakMode = UILineBreakModeWordWrap;
self->theLabel.shadowColor = [UIColor darkGrayColor];
self->theLabel.numberOfLines = 0;
}
return self->theLabel;
}
- (void)setMultilineTitle:(NSString *)title forSegmentAtIndex:(NSUInteger)segment
{
self.theLabel.text = title;
[self.theLabel sizeToFit];
[self setImage:self.theLabel.imageFromLayer forSegmentAtIndex:segment];
}
@end
UIView + LayerShot - archivo de cabecera
//
// UIView+LayerShot.h
//
// Created by Jens Kreiensiek on 29.06.12.
// Copyright (c) 2012 SoButz. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIView (LayerShot)
- (UIImage *)imageFromLayer;
@end
UIView + LayerShot - archivo de implementación
//
// UIView+LayerShot.m
//
// Created by Jens Kreiensiek on 29.06.12.
// Copyright (c) 2012 SoButz. All rights reserved.
//
#import "UIView+LayerShot.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIView (LayerShot)
- (UIImage *)imageFromLayer
{
UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end
Úselo como un control UISegmentado normal:
...
MultiLineSegmentedControl *segment = [[MultiLineSegmentedControl alloc]
initWithItems:[NSArray arrayWithObjects:@"A", @"B", nil]];
segment.segmentedControlStyle = UISegmentedControlStyleBar;
segment.frame = CGRectMake(0, 0, 200, segment.frame.size.height * 1.5);
[segment setMultilineTitle:@"Title A/nSubtitle A" forSegmentAtIndex:0];
[segment setMultilineTitle:@"Title B/nSubtitle B" forSegmentAtIndex:1];
[self.view addSubview:segment];
[segment release];
...
Sintaxis Swift 3+ basada en la answer de @Saranya Sivanandham
UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
Usa UIAppearance para hacer las cosas. El siguiente fragmento de código funcionará. Llama a esto antes de crear tu segmento.
C objetivo
[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];
Rápido
UILabel.appearanceWhenContainedInInstancesOfClasses([UISegmentedControl.self]).numberOfLines = 0