带有 Bezeled 样式的 UISegmentedControl 使设备上的标题不居中
Posted
技术标签:
【中文标题】带有 Bezeled 样式的 UISegmentedControl 使设备上的标题不居中【英文标题】:UISegmentedControl with Bezeled Style uncenters titles on Device 【发布时间】:2012-06-11 18:23:53 【问题描述】:为澄清起见,我将添加 2 个重叠的屏幕截图,一个在 Interface Builder 中,另一个在设备上。 较低的 UISegmentedControl 刚从库中出来,没有编辑任何属性,但它在设备上看起来仍然不同(在这种情况下是非 Retina iPad,尽管 Retina-iPhone 的问题是相同的)(对于快速而肮脏的 photoshopping 感到抱歉)
有什么想法吗?
编辑:我显然尝试了界面生成器中实用程序选项卡中“控制”下的“对齐”。不幸的是,这些设置都没有改变 UISegment 中的标题。我认为他们不应该这样做,因为他们也没有更改 Interface Builder 中的标题。
EDIT2:以编程方式设置:
eyeSeg.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
也没什么区别。
【问题讨论】:
【参考方案1】:嗯...你检查对齐了吗?也许是这样。
【讨论】:
如果你说的是 Utilities-Tab 中的 Control 下的对齐,我一开始确实玩过。不幸的是,这些设置都没有改变 UISegment 中的标题。【参考方案2】:发现问题“UISegmentedControlStyleBezeled 已弃用。请使用其他样式。”
另见what-should-i-use-instead-of-the-deprecated-uisegmentedcontrolstylebezeled-in-io
【讨论】:
是的。我也在考虑这个;但是,我不太确定,因为 Apple 尚未更新他们关于弃用 UISegmentedControlStyleBezeled 的文档。但是,感谢您的提问和回答。 :)【参考方案3】:您可以递归地在 UISegmentedControl
视图的子视图中搜索分段控件中的每个 UILabels
,然后更改每个 UILabel
的属性,包括 textAlignment
属性,如我在示例中所示我的代码。感谢 Primc 回复 Change font size of UISegmented Control 的帖子,因为他建议使用这种通用方法来自定义 UISegmentedControl
的 UILabels
。顺便说一句,尽管我最近切换到 UISegmentedControlStyleBar
并调整了框架高度,但我一直在使用带有 UISegmentedControlStyleBezeled
样式的代码,即使它已被弃用。
- (void)viewDidLoad
[super viewDidLoad];
// Adjust the segment widths to fit the text. (Will need to calculate widths if localized text is ever used.)
[aspirationControl setWidth:66 forSegmentAtIndex:0]; // Navel Lint Collector
[aspirationControl setWidth:48 forSegmentAtIndex:1]; // Deep Thinker
[aspirationControl setWidth:49 forSegmentAtIndex:2]; // Mental Wizard
[aspirationControl setWidth:64 forSegmentAtIndex:3]; // Brilliant Professor
[aspirationControl setWidth:58 forSegmentAtIndex:4]; // Nobel Laureate
// Reduce the font size of the segmented aspiration control
[self adjustSegmentText:aspirationControl];
- (void)adjustSegmentText:(UIView*)view
// A recursively called method for finding the subviews containing the segment text and adjusting frame size, text justification, word wrap and font size
NSArray *views = [view subviews];
int numSubviews = views.count;
for (int i=0; i<numSubviews; i++)
UIView *thisView = [views objectAtIndex:i];
// Typecast thisView to see if it is a UILabel from one of the segment controls
UILabel *tmpLabel = (UILabel *) thisView;
if ([tmpLabel respondsToSelector:@selector(text)])
// Enlarge frame. Segments are set wider and narrower to accomodate the text.
CGRect segmentFrame = [tmpLabel frame];
// The following origin values were necessary to avoid text movement upon making an initial selection but became unnecessary after switching to a bar style segmented control
// segmentFrame.origin.x = 1;
// segmentFrame.origin.y = -1;
segmentFrame.size.height = 40;
// Frame widths are set equal to 2 points less than segment widths set in viewDidLoad
if ([[tmpLabel text] isEqualToString:@"Navel Lint Collector"])
segmentFrame.size.width = 64;
else if([[tmpLabel text] isEqualToString:@"Deep Thinker"])
segmentFrame.size.width = 46;
else if([[tmpLabel text] isEqualToString:@"Mental Wizard"])
segmentFrame.size.width = 47;
else if([[tmpLabel text] isEqualToString:@"Brilliant Professor"])
segmentFrame.size.width = 62;
else
// @"Nobel Laureate"
segmentFrame.size.width = 56;
[tmpLabel setFrame:segmentFrame];
[tmpLabel setNumberOfLines:0]; // Change from the default of 1 line to 0 meaning use as many lines as needed
[tmpLabel setTextAlignment:UITextAlignmentCenter];
[tmpLabel setFont:[UIFont boldSystemFontOfSize:12]];
[tmpLabel setLineBreakMode:UILineBreakModeWordWrap];
if (thisView.subviews.count)
[self adjustSegmentText:thisView];
分段控制标签文本在 IB 中的外观很难看,但使用上述代码在设备和模拟器中完美居中并包裹在 2 行中。
【讨论】:
以上是关于带有 Bezeled 样式的 UISegmentedControl 使设备上的标题不居中的主要内容,如果未能解决你的问题,请参考以下文章