【问题标题】:Title of Segmented Control does not fit, overlaps分段控件的标题不适合,重叠
【发布时间】:2017-05-17 19:52:47
【问题描述】:

在我的分段控件中,有时标题比其分段更宽。我怎样才能让它截断?

假设段 1 的标题是 Text overlaps,段 2 的名称是 ok

我希望它看起来如何:

  [Text ov...|   ok   ]

它的样子:

 T[ext overla|ps  ok   ]

我尝试了什么:

在设置片段的标题之前,我是否必须自己截断它?

【问题讨论】:

    标签: ios cocoa-touch uikit uisegmentedcontrol


    【解决方案1】:

    你必须自己截断它。

    没有用于设置截断的公共 API。即使您挖掘UISegmentedControl 的私有视图层次结构,找到标签并将lineBreakMode 设置为UILineBreakModeTailTruncation,它也不会为您截断标签。 (我试过了。)

    编辑:我得到了这个工作。它不漂亮,它可能会在未来的 iOS 版本中停止工作,并且可能会让你被 App Store 拒绝。

    static void fixLineBreakMode(UIView *view)
    {
        if ([view respondsToSelector:@selector(setLineBreakMode:)]) {
            [(id)view setLineBreakMode:UILineBreakModeTailTruncation];
            [view setFrame:CGRectInset([view.superview bounds], 6, 0)];
        } else {
            for (UIView *subview in view.subviews)
                fixLineBreakMode(subview);
        }
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        fixLineBreakMode(self.segmentedControl);
    }
    

    【讨论】:

    • 应用被拒绝的原因是什么?
    • 您将访问私有视图层次结构。我不知道他们会不会因此而拒绝你。我只是指出可能性。
    【解决方案2】:

    当我需要用 x 个段填充分段控件时,我遇到了同样的挑战。一些标题悬而未决。如果标题太长,我会尝试截断中间的标题。我做了类似的事情:

        NSString *s = @"This title is too long to fit";
    NSMutableString *mS = [[NSMutableString alloc] init];
    int len = [s length];
    if (len > 10) {
        for (int i = 0; i < len; i++) {
            unichar ch = [s characterAtIndex:i];
            if(i > 3 && i < 6){
                [mS appendString:@"."];
            } else  {
                [mS appendString:[NSString stringWithFormat: @"%C", ch]];
            }
        }
    }
    

    这只是给你一些想法。您可以限制中间的点数,只需计算附加的点数并停止添加,例如它达到 3。当您有截断的字符串时,您可以使用它来设置段标题。头尾截断的逻辑相同。

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      相关资源
      最近更新 更多