UISegmentedControl text with multiple lines?

前端 未结 6 1793
再見小時候
再見小時候 2020-12-08 04:20

How can I make the text in one of the buttons in my UISegmentedControl span multiple lines?

相关标签:
6条回答
  • 2020-12-08 05:01

    Use UIAppearance to get things done. The below code snippet will work. Call this before creating your segment.

    Objective-C

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

    Swift

    UILabel.appearanceWhenContainedInInstancesOfClasses([UISegmentedControl.self]).numberOfLines = 0
    
    0 讨论(0)
  • 2020-12-08 05:01

    Years later...

         for segment in segmented.subviews{
            for label in segment.subviews{
                if let labels = label as? UILabel{
                    labels.numberOfLines = 2
    
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-08 05:03

    The approach above is better, but for the sake of having an alternative, you can do something like:

    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;
                    }
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-08 05:10

    I did it this way:

    • create a multiline UILabel
    • fill the label with N lines of text
    • convert the label into an UIImage
    • set the image as a segments content

    This works smooth on iOS 4, 5, 6

    Sample Image iOS 5

    and iOS 7 (just remove the text shadow)

    Sample Image iOS 7

    MultiLineSegmentedControl - header file

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

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

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

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

    Use it just like a 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];
    
    ...
    
    0 讨论(0)
  • 2020-12-08 05:14

    For iOS 12, the below code will work like charm

        [[UILabel appearanceWhenContainedInInstancesOfClasses:@[[UISegmentedControl class]]] setNumberOfLines:0];
    
    0 讨论(0)
  • 2020-12-08 05:17

    Swift 3+ syntax based on answer by @Saranya Sivanandham

    UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
    
    0 讨论(0)
提交回复
热议问题