UITextView滚动时透明/穿透至其他元素后方?如何禁用该效果?
这问题我做项目时也碰到过,大概率是视图层级或者UITextView的默认属性在搞鬼,咱们一步步拆解原因和解决方案:
可能的原因及对应解决方法
1. 视图层级错乱(最常见)
你说把UITextView放到了Nom标签上方,但滚动时内容还是跑到标签后面,很可能是实际视图层级没调整对:
- 如果用Storyboard/XIB:打开左侧的Document Outline视图列表,找到你的UITextView,把它拖到Nom标签的上方(列表里越靠上的视图,显示层级越高)。
- 如果用代码创建:在添加UITextView后,调用父视图的
bringSubviewToFront(_:)方法,确保UITextView处于最上层:parentView.bringSubviewToFront(yourTextView)
2. UITextView的clipsToBounds未开启
默认情况下,UITextView的clipsToBounds是NO,这意味着滚动时内容会超出UITextView的边界。如果其他视图的层级比UITextView高,超出的内容就会跑到这些视图后面。
解决方法:把clipsToBounds设为YES,让内容只在UITextView的范围内滚动:
yourTextView.clipsToBounds = true
如果需要内容滚动时不被截断,那还是要回到上面的视图层级调整,确保UITextView整体在其他视图上方。
3. 背景色导致的“透明错觉”
如果UITextView的backgroundColor设为了clear,滚动时内容会透过UITextView看到下面的元素,看起来像是内容跑到了后面。
解决方法:把UITextView的背景色设置为和父视图一致的颜色,或者你需要的不透明颜色:
yourTextView.backgroundColor = .white // 或者和父视图相同的颜色
4. CALayer的zPosition被覆盖
如果其他视图的layer.zPosition被手动设置了更高的值,即使UITextView在视图列表里靠上,也会被遮挡。
解决方法:给UITextView的layer设置一个更高的zPosition值:
yourTextView.layer.zPosition = 100 // 数值只要比其他视图的zPosition高就行
额外排查点
如果上面的方法都没用,检查一下你的UITextView是不是嵌套在其他滚动视图(比如UITableView、UIScrollView)里?嵌套滚动可能会导致层级计算异常,这种情况下可以尝试把UITextView的isScrollEnabled暂时设为NO,看看静态时内容是否正常显示在Nom标签上方,再逐步排查滚动冲突的问题。
内容的提问来源于stack exchange,提问作者Zaki Zakaria

