带有 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 的帖子,因为他建议使用这种通用方法来自定义 UISegmentedControlUILabels。顺便说一句,尽管我最近切换到 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 使设备上的标题不居中的主要内容,如果未能解决你的问题,请参考以下文章

带有样式组件的滑动按钮样式

带有样式组件的样式链接

无法使用带有样式组件的关键帧设置嵌套动画的样式

带有样式表的 QProgressBar

带有默认样式表的动态内联样式 React Native

带有外部样式表的div?