如何让SkyFloatingLabelTextField的右侧UIImageView与文本垂直居中对齐?
解决SkyFloatingLabelTextField右侧ImageView垂直居中的问题
这个问题我之前也碰到过,SkyFloatingLabelTextField的rightView默认布局不会自动和输入文本垂直居中——毕竟这个文本框的整体高度包含了顶部的浮动标签区域,而输入文本是在控件下半部分的。给你几个实用的解决办法:
方法一:手动计算偏移量调整Frame
如果你的文本框高度是固定的,可以直接计算图标垂直居中的Y坐标:
let checkmark = UIImage(named: "checkmark") checkmarkImageView = UIImageView(image: checkmark) let iconSize = CGSize(width: 20, height: 20) // 计算垂直居中的Y值:(文本框总高度 - 图标高度) / 2 let yOffset = (textfield!.frame.height - iconSize.height) / 2 checkmarkImageView?.frame = CGRect(x: 0, y: yOffset, width: iconSize.width, height: iconSize.height) textfield?.rightView = checkmarkImageView textfield?.rightViewMode = .always editView.addSubview(textfield!)
注意:如果文本框在不同状态(比如显示/隐藏浮动标签)下高度变化,这种方法需要额外适配状态切换时的偏移量
方法二:使用AutoLayout约束(推荐)
这种方法更灵活,不管文本框高度怎么变,图标都会保持垂直居中。我们可以给图标加一个容器View,通过约束实现精准居中:
let checkmark = UIImage(named: "checkmark") checkmarkImageView = UIImageView(image: checkmark) checkmarkImageView?.translatesAutoresizingMaskIntoConstraints = false // 给图标设置固定宽高 NSLayoutConstraint.activate([ checkmarkImageView!.widthAnchor.constraint(equalToConstant: 20), checkmarkImageView!.heightAnchor.constraint(equalToConstant: 20) ]) // 创建容器View作为rightView let rightContainer = UIView() rightContainer.addSubview(checkmarkImageView!) // 让图标在容器中垂直居中,同时保留左右边距避免太贴边 NSLayoutConstraint.activate([ checkmarkImageView!.centerYAnchor.constraint(equalTo: rightContainer.centerYAnchor), checkmarkImageView!.leadingAnchor.constraint(equalTo: rightContainer.leadingAnchor, constant: 8), checkmarkImageView!.trailingAnchor.constraint(equalTo: rightContainer.trailingAnchor, constant: -8) ]) textfield?.rightView = rightContainer textfield?.rightViewMode = .always editView.addSubview(textfield!)
这种方式的优势是完全基于约束布局,适配性更强,不用手动关心文本框的高度变化逻辑。
内容的提问来源于stack exchange,提问作者sandpat
相关产品推荐
相关产品推荐

