解决在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
里改下布局就可以了,开始以为直接修改label
的width
就可以了,结果设置并没用。说明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];
}
}
}
}
最终效果如下: