UISegmentedControl文本有多行?

Jas*_*son 29 iphone xcode interface-builder uisegmentedcontrol ios

如何使UISegmentedControl中的一个按钮中的文本跨越多行?

小智 37

使用UIAppearance完成任务.以下代码段将起作用.在创建细分之前调用此方法.

Objective-C的

[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];
Run Code Online (Sandbox Code Playgroud)

迅速

UILabel.appearanceWhenContainedInInstancesOfClasses([UISegmentedControl.self]).numberOfLines = 0
Run Code Online (Sandbox Code Playgroud)

  • 由于有人投票:它应该不起作用(numberOfLines甚至不是UIAppearance选择器),但它确实有效.证明:http://i.stack.imgur.com/gE7Dv.png问题似乎是标签宽度似乎只取自第一行.这就是我在代码中添加这些空格的原因. (2认同)

Jen*_*son 31

我是这样做的:

  • 创建一个多行UILabel
  • 用N行文本填充标签
  • 将标签转换为UIImage
  • 将图像设置为段内容

这在iOS 4,5,6上顺利运行

示例图像iOS 5

和iOS 7(只删除文字阴影)

示例图像iOS 7

MultiLineSegmentedControl - 头文件

//
//  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
Run Code Online (Sandbox Code Playgroud)

MultiLineSegmentedControl - 实现文件

//
//  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
Run Code Online (Sandbox Code Playgroud)

UIView + LayerShot - 头文件

//
//  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
Run Code Online (Sandbox Code Playgroud)

UIView + LayerShot - 实现文件

//
//  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
Run Code Online (Sandbox Code Playgroud)

像普通的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];

...
Run Code Online (Sandbox Code Playgroud)


Mav*_*ick 13

基于@Saranya Sivanandham的回答Swift 3+语法

UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
Run Code Online (Sandbox Code Playgroud)

  • 它对我不起作用:(有没有人尝试过这个并得到了预期的结果?? (2认同)