iOS猛码计划iOS - 大杂烩移动开发技术前沿

解决在iOS11,UISegmentedControl显示不完整

2017-10-01  本文已影响150人  14bf7199f818
问题描述:

最近在做iOS11适配,遇到一个比较奇怪的问题,UISegmentedControl的标题在iOS11的机型上显示不全,但在iOS11之前版本是完全正常的。

显示的效果就像这样:

我设置的Item title为Phone,AccountId长度也不会太长。

问题探索:

遇到这种问题,首先想到的是不是iOS11对UISegmentedControl有新的改动,比如弃用了某些API,又新增了某些API导致的。我就到UISegmentedControl头文件找了一遍,并没有发现针对iOS11的任何更新。

但在UISegmentedControl.h里发现了这个方法:

- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment;         // set to 0.0 width to autosize. default is 0.0

我之前肯定是没调用这个方法的,那么系统默认设置为0了。也就是autosize属性,我就怀疑autosize在iOS11可能出现了问题。那么自己重设width,无论我怎么设置width,虽然item宽度的确变宽了,但标题依然显示...

常规手段不能解决这个问题,只能用非常规手段了。打开Debug View Hierarchy,�可以看到UISegmentedControl里面的Label宽度明显太窄,那么把宽度设置更宽一点应该就可以了。

然后在左侧可以看到UISegmentedControl的层级关系如下:

那么我们把UISegmentLabel给抓取到,改它的宽度。

问题解决:

那么继承一个UISegmentedControl,然后在layoutSubviews里改下布局就可以了,开始以为直接修改labelwidth就可以了,结果设置并没用。说明UISegmentedControl是自动布局写的,那么重写下label的布局就可以了。重运行后,Title能完整显示,证明更改UISegmentLabel猜想是正确的。核心代码如下:

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subView in self.subviews) {
        for (UIView *subSubview in subView.subviews) {
            if ([subSubview isKindOfClass:[UILabel class]]) {
                UILabel *label = (UILabel *)subSubview;
                [label setTranslatesAutoresizingMaskIntoConstraints:NO];
                NSLayoutConstraint *constraintCenterX = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:subView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0];
                [subView addConstraint:constraintCenterX];
                NSLayoutConstraint *constraintCenterY = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:subView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0];
                [subView addConstraint:constraintCenterY];
                NSLayoutConstraint *constraintWidth = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:subView attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0];
                [subView addConstraint:constraintWidth];
            }
        }
    }
}

最终效果如下:

上一篇下一篇

猜你喜欢

热点阅读