segmented objective how example control change iphone xcode ios interface-builder uisegmentedcontrol

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