【问题标题】:UISegmentedControl truncates segment titlesUISegmentedControl 截断段标题
【发布时间】:2013-09-24 06:53:11
【问题描述】:

我的 iPhone 应用程序中有一个分段控件,它在 ios6 上运行良好,但在 ios7 上分段图块被截断(文本有足够的空间,但无论如何它都会截断它们)

    self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
self.segmentedControl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
NSDictionary *defaultTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:defaultFont,
                                       UITextAttributeFont,
                                       defaultFontColor,
                                       UITextAttributeTextColor,
                                       nil];
[self.segmentedControl setTitleTextAttributes:defaultTextAttributes forState:UIControlStateNormal];

NSDictionary *selectedTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:selectedFont,
                                        UITextAttributeFont,
                                        selectedFontColor,
                                        UITextAttributeTextColor,
                                        nil];
[self.segmentedControl setTitleTextAttributes:selectedTextAttributes forState:UIControlStateHighlighted];

关于如何解决此问题的任何建议?为什么它可以在 ios6 上正常工作,但在 ios7 上截断标题...

这是导致问题的代码...

      UIImage *unselectedBackgroundImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];
    /* Selected background */
    UIImage *selectedBackgroundImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];
    /* Image between two unselected segments */
    UIImage *bothUnselectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)];
     /* Image between segment selected on the left and unselected on the right */
    UIImage *leftSelectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)];
    /* Image between segment selected on the right and unselected on the right */
    UIImage *rightSelectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)];

    if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) {
#ifdef __IPHONE_7_0
        unselectedBackgroundImage = [unselectedBackgroundImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        selectedBackgroundImage = [selectedBackgroundImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        bothUnselectedImage = [bothUnselectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        leftSelectedImage = [leftSelectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        rightSelectedImage = [rightSelectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
#endif
    }


    [[UISegmentedControl appearance] setBackgroundImage:unselectedBackgroundImage
                                               forState:UIControlStateNormal
                                             barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setBackgroundImage:selectedBackgroundImage
                                               forState:UIControlStateSelected
                                             barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setDividerImage:bothUnselectedImage
                                 forLeftSegmentState:UIControlStateNormal
                                   rightSegmentState:UIControlStateNormal
                                          barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setDividerImage:leftSelectedImage
                                 forLeftSegmentState:UIControlStateSelected
                                   rightSegmentState:UIControlStateNormal
                                          barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setDividerImage:rightSelectedImage
                                 forLeftSegmentState:UIControlStateNormal
                                   rightSegmentState:UIControlStateSelected
                                          barMetrics:UIBarMetricsDefault];

如果我将其注释掉,标签会正常显示……但我需要背景图片…… 那么如何在保持 ios6 兼容性的同时在 ios7 上进行自定义分段控制

【问题讨论】:

  • 同样的事情,兄弟!只是我没有使用任何图像作为标签 - 只有标题。最奇怪的是,当应用程序启动时,所有标题看起来都不错,但是如果您转到主屏幕并返回应用程序,那么当您点击分段控制按钮时,此按钮的标题将被截断。这是 iPad 应用程序。
  • 好吧,我想我通过设置标题的字体来修复它......所以,你似乎有不同的问题。对不起
  • stackoverflow.com/questions/11990330/…接受的答案是解决这个问题的方法。

标签: iphone uisegmentedcontrol ios7


【解决方案1】:

我通过为选择状态设置与正常状态相同的标题文本属性来解决此问题。 在 iOS 6 中这已经足够了:

NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   someUIFont, UITextAttributeFont,
                                   nil];

[self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];

现在我必须添加它以使其适用于 iOS 7:

[self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateSelected];

【讨论】:

  • 这对我有用。而且我发现只要禁用状态是较大的字体大小,它就不会截断标签。
【解决方案2】:

经过一番研究,这是我对该问题的解决方案(Swift 3、iOS 10)

class CustomSegmentedControl: UISegmentedControl {

override func draw(_ rect: CGRect) {

    for segment in subviews {
        for subview in segment.subviews {
            if let segmentLabel = subview as? UILabel {
                segmentLabel.numberOfLines = 0
                segmentLabel.translatesAutoresizingMaskIntoConstraints = false
                segmentLabel.leadingAnchor.constraint(equalTo: segment.leadingAnchor).isActive = true
                segmentLabel.trailingAnchor.constraint(equalTo: segment.trailingAnchor).isActive = true
                segmentLabel.topAnchor.constraint(equalTo: segment.topAnchor).isActive = true
                segmentLabel.bottomAnchor.constraint(equalTo: segment.bottomAnchor).isActive = true
            }
        }
    }
}

override func didMoveToSuperview() {
    self.layer.cornerRadius = 5
    self.clipsToBounds = true
    self.backgroundColor = .white
    self.tintColor = UIColor.orange

    let font = UIFont(name: "Helvetica", size: 12.0)
    self.setTitleTextAttributes([NSFontAttributeName: font!], for: .normal)

    let fontBold = UIFont(name: "Helvetica-Bold", size: 12.0)
    self.setTitleTextAttributes([NSFontAttributeName: fontBold!], for: .selected)
}
}

【讨论】:

    【解决方案3】:

    我尝试了一些解决方案来避免重新计算所有段大小。
    为了解决我的问题,我将此代码放在分段控件的 valueChange 操作上:

    for(int i=0;i<setControl.subviews.count; i++){
      NSString *title=[segControl titleForSegmentAtIndex:i];
      [segControl setTitle:title forSegmentAtIndex:i];
    }
    

    在 iOS7 上运行的为 iOS6(使用 Xcode 4.6.3)编译的应用会出现此问题。该故障在应用从暂停状态重新激活后可见,但并非在所有视图中。

    【讨论】:

      【解决方案4】:

      我正在更新标题,但由于原始标题的长度小于新标题,它被截断了。 所以,我在原始标题的文本中添加了永久不间断空格\u{00a0},以便匹配前后标题的长度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 2022-01-14
        • 2011-09-07
        相关资源
        最近更新 更多