如何防止UITextView内文本超出控件边界显示?
问题重现
在Storyboard创建的UIViewController内有一个UITextView,已绑定myTextView输出口及固定尺寸约束,垂直高度约束初始未激活。当文本长度≥32时,激活高度约束(设为240)并显示UITextView;否则用UILabel展示文本。设置文本后,文本略长时可正常滚动,但文本远超容纳范围时,内容会在UITextView上下边界外溢出,滚动时随方向偏移,控件边框可见。已开启masksToBounds和clipsToBounds,禁用自动转换约束。
解决方案
尝试以下步骤逐一排查修复:
重置文本容器内边距
UITextView的textContainerInset和lineFragmentPadding若被意外修改,可能导致内容超出控件边界。在设置文本后添加以下代码:self.myTextView.textContainerInset = UIEdgeInsetsZero; self.myTextView.textContainer.lineFragmentPadding = 0;可根据需求调整内边距值,但需确保内容不会超出控件高度范围。
强制刷新布局
在激活高度约束并设置文本后,强制触发布局更新,确保控件尺寸正确应用:self.myViewHeight.active = YES; self.myTextView.text = descript; [self.view layoutIfNeeded];排查约束冲突
检查Storyboard中是否存在与myViewHeight冲突的约束(比如父视图的垂直约束、UITextView的其他高度相关约束)。可通过Debug View Hierarchy查看控件实际尺寸是否为设置的240,若不符需清理冲突约束。确认裁剪属性生效时机
确保clipsToBounds和masksToBounds在约束激活后生效,或在styleAndAddBorderTo方法中明确设置:self.myTextView.clipsToBounds = YES; self.myTextView.layer.masksToBounds = YES;注意:
masksToBounds作用于图层,clipsToBounds作用于视图本身,两者同时开启才能确保内容被正确裁剪。检查滚动相关属性
确认UITextView的scrollEnabled为YES(默认值),且未手动修改contentOffset导致内容偏移出可视区域:self.myTextView.scrollEnabled = YES; [self.myTextView setContentOffset:CGPointZero animated:NO];
内容的提问来源于stack exchange,提问作者user6631314

