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