Cómo puedo hacer que el texto en uno de los botones de mi UISegmentedControl abarcan varias líneas?

  • Todas las actualizaciones sobre su problema?
InformationsquelleAutor Jason | 2011-04-10

6 Comentarios

  1. 36

    Uso UIAppearance para hacer las cosas. El siguiente fragmento de código de trabajo. Llamar a este antes de la creación de su segmento.

    Objective-C

    [[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];

    Swift

    UILabel.appearanceWhenContainedInInstancesOfClasses([UISegmentedControl.self]).numberOfLines = 0
    • Ya que alguien votada abajo: no Se debe trabajar (numberOfLines no es ni siquiera un UIAppearance selector), pero realmente funciona. Prueba: i.stack.imgur.com/gE7Dv.png Problema parece ser que el ancho de la etiqueta parece ser tomadas exclusivamente desde la primera línea. Por eso he añadido estos espacios en el código.
    • pruebe a quitar el carácter de nueva línea
    • Sin el caracter de fin de línea no sería un multi etiqueta de línea. 😉 Gracias de todos modos, pero yo no tengo ese problema, he resuelto con la parte superior de votación de respuesta hace un tiempo. Sólo quería explicar que el downvote no era necesario.
    • Esta API está disponible en iOS 9.0+.
    • por favor, actualice su swift ejemplo a Swift 3. thx
    • No trabajo en iOS11.3
    • [[UILabel appearanceWhenContainedInInstancesofclasses:@[[UISegmentedControl clase]]] setNumberOfLines:0]; el código de trabajo para iOS 12
    • Swift 5 (añadir en el AppDelegate para conseguir que esto funcione para los controles que se agregan en el Guión gráfico): UILabel.apariencia(whenContainedInInstancesOf: [UISegmentedControl.auto]).numberOfLines = 0

  2. 31

    Me hizo de esta manera:

    • crear un multilínea UILabel
    • llenar la etiqueta con N líneas de texto
    • convertir la etiqueta en un UIImage
    • establecer la imagen como un segmento de contenido

    Esto funciona suave en el iOS 4, 5, 6

    UISegmentedControl de texto con varias líneas?

    y iOS 7 (sólo quitar la sombra de texto)

    UISegmentedControl de texto con varias líneas?

    MultiLineSegmentedControl – archivo de encabezado

    //
    // 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 encabezado

    //
    // 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

    Usarlo sólo como una normal UISegmentedControl:

    ...
    
    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];
    
    ...
    • Puede usted por favor mostrar la implementación de este? gracias.
    • nickfox, he añadido un ejemplo. Espero que esto ayude…
    • No puedo ver ningún subtítulo. He creado subclase de UISegmentedControl & añadido código anterior. Crear un MultiLineSegmentedControl en viewDidLoad de mi punto de vista controlador. Pero no se muestran los subtítulos. Tengo #import «MultiLineSegmentedControl.h». Me pueden ayudar ? Gracias
    • iOSAppDev, he actualizado el ejemplo para el método que estoy usando ahora en iOS 6. Darle una oportunidad…
    • He Segmento de nombres como @»Todos», @»Mi\nFriends»,@»Cerrar\nSoon», @»Cercanos». Pero todavía no se muestra correctamente. Tiene un look esta pasando mal aquí ?
    • Por favor, mostrar algo de código de su segmento creación y configuración de título de…
    • Esta es la mejor solución de su misma cosa iba en mi mente.
    • hizo u got it resuelto @iOSAppDev?
    • m también tienen el mismo problema como se especifica por @iOSAppDev

  3. 11

    Swift 3+ la sintaxis basada en respuesta por @Saranya Sivanandham

    UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
    • no es trabajo para mí : (¿alguien intente esto y tuvo el resultado esperado ??
    • va a trabajar con el guión?
    • Chejaria. Sí, añadir esta línea en el Delegado de la Aplicación o cualquier otra clase de trabajo para UISegmentedControl que se agrega ya sea de programación o de Guión.
    • Se trabajó. Gracias..
  4. 3

    El enfoque de arriba es mejor, pero por el bien de 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;
                    }
                }
            }
        }
    • Hola @moby, gracias por tu alternativa. si quiero dar un nombre diferente para mi el texto de la etiqueta, ¿cómo puedo hacerlo en su alternativa?
  5. 0

    Años más tarde…

         for segment in segmented.subviews{
            for label in segment.subviews{
                if let labels = label as? UILabel{
                    labels.numberOfLines = 2
    
                }
            }
        }
  6. 0

    Para iOS 12, el siguiente código de trabajo como el encanto

        [[UILabel appearanceWhenContainedInInstancesOfClasses:@[[UISegmentedControl class]]] setNumberOfLines:0];

Dejar respuesta

Please enter your comment!
Please enter your name here