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