Snapkit布局问题:UITextView超出弹窗视图,标题与文本间距不符
这两个问题都是约束设置逻辑不当导致的,咱们一步步拆解修复:
问题1:UITextView超出popUpView范围
你的nameTextView右约束用了greaterThanOrEqualTo(popUpView).offset(20),这相当于允许TextView的右边缘在popUpView右边缘右侧20pt的位置,必然会超出弹窗范围。另外width.lessThanOrEqualTo(popUpView)属于冗余约束,正确的边距约束已经能控制宽度。
修复方式:把右约束改成equalTo(popUpView).offset(-20),让TextView右边缘和popUpView保持20pt的内边距,和左边距对称。
问题2:标题与TextView实际间距大于设置的10px
你给nameTextView加了centerY.equalTo(popUpView)约束,这会强制TextView在弹窗垂直居中,直接和top.equalTo(popUpTitle.snp.bottom).offset(10)的约束产生冲突。AutoLayout会根据约束优先级调整布局,最终导致top的10pt偏移被忽略,间距变大。
修复方式:移除centerY.equalTo(popUpView)约束,让TextView的位置完全由top、左右边距约束来控制。
修复后的完整代码:
private func makePopUpTitle() { popUpTitle.text = "List Name" popUpView.addSubview(popUpTitle) popUpTitle.snp.makeConstraints { make in make.centerX.equalTo(popUpView) make.top.equalTo(popUpView).offset(20) } } private func makeListNameTextView() { self.automaticallyAdjustsScrollViewInsets = false popUpView.addSubview(nameTextView) nameTextView.snp.makeConstraints { make in // 用inset语法糖统一设置左右20pt内边距,避免超出弹窗 make.left.right.equalTo(popUpView).inset(20) // 保留和标题的10pt间距,移除冲突的垂直居中约束 make.top.equalTo(popUpTitle.snp.bottom).offset(10) make.height.equalTo(35) } }
补充说明:如果需要TextView在弹窗内处于特定垂直位置,不要同时使用top和centerY这类逻辑冲突的约束,选其中一种布局逻辑即可。SnapKit的inset(20)是语法糖,等价于left.offset(20) + right.offset(-20),写起来更简洁。
内容的提问来源于stack exchange,提问作者Alex

