您的位置:首页 > 移动开发 > IOS开发

RFSegmentView在iOS7设备上不显示label的解决方案

2015-11-04 14:59 525 查看
    由于项目原因,需要segment的切换效果,发现github上 王若风 同学(https://github.com/wangruofeng/RFSegmentView)做的很不错,便拿来用。

    集成好后,在iOS9的模拟器上效果挺满意,谁知到了iOS7的设备上,只显示边框了,就像这样:



顺便放张正常的效果图:



对比分析发现,是label试图没有正常显示导致的。于是进去看代码。。。

==========================================================

1、调试发现:在iOS9上,- (void)layoutSubviews{} 方法会调用两遍。

    第一遍调用时,label的width/height都被设成0。而第二遍调用后,width/height才会是期望值。正是因为调用了两遍,label才能正常显示

2、在iOS7上,- (void)layoutSubviews{} 仅仅调用一边。于是,只能看到边框了。。。

修改如下:

//configure bgView
self.bgView.frame = CGRectMake(leftRightMargin, (viewHeight - self.itemHeight?:kItemHeight)/2, viewWidth - 2*kLeftRightMargin, self.itemHeight?:kItemHeight);
/**
* 在初始化label的rect之前,给itemWidth、itemHeight重新赋值,保证iOS7能正常显示
*/
itemWidth = CGRectGetWidth(self.bgView.frame)/count;
itemHeight = CGRectGetHeight(self.bgView.frame);

//configure items
[self.items enumerateObjectsUsingBlock:^(RFSegmentItem * _Nonnull item, NSUInteger idx, BOOL * _Nonnull stop) {
item.frame = CGRectMake(initX, initY, itemWidth, itemHeight);
initX += itemWidth;
}];
后记:
虽然问题解决了,但留下了疑问,iOS9为什么会多调用一遍??

网上说好几种情况会调- (void)layoutSubviews{} ,但这里代码是一样的,只是系统的差异,有哪位大神知道原因呢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息