UISegmentedControl中的两行文本

尝试我可能,我无法解决iOS7 iPhone应用程序的UISegmentedControl错误。

当我创build分段控件时,我使用下面的代码:

NSArray *segmentedControlItemArray = [NSArray arrayWithObjects: @"Nominal:\n27 inch", @"Actual:\n700c x 23mm", @"Actual:\n700c x 20mm", nil]; _wheelDiameterSegmentedControl = [[UISegmentedControl alloc] initWithItems:segmentedControlItemArray]; _wheelDiameterSegmentedControl.frame = CGRectMake(0, 102, 290, 50); _wheelDiameterSegmentedControl.selectedSegmentIndex = 0; _wheelDiameterSegmentedControl.tintColor = [UIColor colorWithRed:0.35 green:0.4 blue:0.9 alpha:1.0]; for (id segment in [_wheelDiameterSegmentedControl subviews]) { for (id label in [segment subviews]) { if ([label isKindOfClass:[UILabel class]]) { UILabel *titleLabel = (UILabel *) label; titleLabel.numberOfLines = 0; } } } [_wheelDiameterSegmentedControl addTarget:self action:@selector(pickOne:) forControlEvents:UIControlEventValueChanged]; [_wheelDiameterMenuContainer addSubview:_wheelDiameterSegmentedControl]; 

不幸的是,我无法发布图片,或者我会告诉你一个我想要的控件的图片:UISegmented控件中的每个段都有两行文本,在我要求的地方有一个换行符。

不过,在旋转的时候,我想保持分段控件的全宽,并且在这个宽的段中,换行符看起来很傻。 所以,在willAnimateRotationToInterfaceOrientation,我已经包含了下面的代码,在string中没有换行符:

  [_wheelDiameterSegmentedControl setFrame:CGRectMake(0, 102, 450, 50)]; [_wheelDiameterSegmentedControl setTitle:@"Nominal: 27 inch" forSegmentAtIndex:0]; [_wheelDiameterSegmentedControl setTitle:@"Actual: 700c x 23mm" forSegmentAtIndex:1]; [_wheelDiameterSegmentedControl setTitle:@"Actual: 700c x 20mm" forSegmentAtIndex:2]; 

再次,如果我可以插入一个图像,我会告诉你一个正是我想要的图像:一个宽的UISegmented控件,在标签中没有换行符(每行标签有一行文本)。

这是我遇到麻烦的地方。 我的select,当我旋转回肖像,似乎是:

1行标签文本,截断格式

“实际:7 …”

当我只是重新使用UISegmentedControl的大小

 [_wheelDiameterSegmentedControl setFrame:CGRectMake(0, 102, 290, 50)]; 

2行标签文本,截断,格式

“实际:
700c x …“

当我重置大小,并重置string值和重新运行的代码循环设置标签的numberOfLines为2,使用

  NSArray *segmentedControlItemArray = [NSArray arrayWithObjects: @"Nominal:\n27 inch", @"Actual:\n700c x 23mm", @"Actual:\n700c x 20mm", nil]; [_wheelDiameterSegmentedControl setTitle:[segmentedControlItemArray objectAtIndex:0] forSegmentAtIndex:0]; [_wheelDiameterSegmentedControl setTitle:[segmentedControlItemArray objectAtIndex:1] forSegmentAtIndex:1]; [_wheelDiameterSegmentedControl setTitle:[segmentedControlItemArray objectAtIndex:2] forSegmentAtIndex:2]; for (id segment in [_wheelDiameterSegmentedControl subviews]) { for (id label in [segment subviews]) { if ([label isKindOfClass:[UILabel class]]) { UILabel *titleLabel = (UILabel *) label; titleLabel.numberOfLines = 2; } } } [_wheelDiameterSegmentedControl setFrame:CGRectMake(0, 102, 290, 50)]; 

带有格式的3行标签文本

“实际:
700c x
20毫米”

这就是当我在第一个设置UISegmentedControl的时候用上面的numberOfLines = 0代替强制的numberOfLines = 2的时候得到的结果。

我想要的是当我创build控件时所得到的结果

“实际:
700c x 20mm“

但是不pipe我尝试了什么(将string和numberOfLines代码放入到willRotateToInterfaceOrientation或didRotateFromInterfaceOrientation中;在更改文本之前重新设置UISegmentedControl的框架;在更改文本之后重新设置框架…),我可以“让我的漂亮,整齐,双线标签回来。 我在这里错过了什么?

啊哈! 操作系统在旋转时如何处理标签的大小与创build时处理标签的方式不同。 所以我强制标签的框架的大小,使用

 for (id segment in [_wheelDiameterSegmentedControl subviews]) { for (id label in [segment subviews]) { if ([label isKindOfClass:[UILabel class]]) { UILabel *titleLabel = (UILabel *) label; //inserting line here, to make the frame behave nicely: // titleLabel.frame = CGRectMake(0, 0, 97, 50); // //continuing as before titleLabel.numberOfLines = 0; } } } 

现在它显示完全按照我想要的/期望。 好哇!


如果你只是想在你的UISegmentedControl中获得两行(或更多)的文本。 使用Herzian的惊人的技术! 这只是另一个代码示例,可以帮助人们…

 self.yourSlider .. set the height manually (can't easily do it in XIB) // now use amazing Herzian technology... for (id segment in [self.yourSlider subviews]) for (id label in [segment subviews]) { if ([label isKindOfClass:[UILabel class]]) { UILabel *titleLabel = (UILabel *) label; titleLabel .. set the width to say 80, per your layout; (the width us typically too low) titleLabel.numberOfLines = 0; } } 

再次感谢你。

工作代码在ios 7:

我有一个四段的段控制器,我需要在两行文本。 所以我添加了UILabel作为UISegmentedControl一个subview ,它工作的很好。 我已经尝试了所有其他方式,但在ios 7和ios 8中,它现在正在运行良好。

 for(int k =0;k<4;k++) { NSString *text = @"title name"; UILabel *label = [[UILabel alloc] init]; label.frame = CGRectMake(10,2, (self.segmentcontroll.frame.size.width/4), 34); label.font = [UIFont fontWithName:@"HelveticaNeue" size:12.0]; label.textColor = [UIColor whiteColor]; label.text = text; label.numberOfLines = 0; label.textAlignment = NSTextAlignmentCenter; [label sizeToFit]; [[[self.segmentcontroll subviews] objectAtIndex:k] addSubview:label]; } 

如果有人愿意的话,Herzian的解决scheme就是一个类别。 请记住在VWA中调用它,而不是在VDL中调用,所以在自动调整/旋转后会发生

 #import "UISegmentedControl+MultiLine.h" @implementation UISegmentedControl (MultiLine) -(void)setupMultiLine { self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height*1.6); for (id segment in self.subviews) { for (id label in [segment subviews]) { if ([label isKindOfClass:[UILabel class]]) { UILabel *titleLabel = (UILabel*) label; titleLabel.frame = CGRectMake(0, 0, titleLabel.frame.size.width, titleLabel.frame.size.height*1.6); titleLabel.numberOfLines = 0; } } } } @end