Swift UIKit中UIButton点击区域过小问题如何解决?
问题原因
你的PassButton本身没有设置明确的尺寸约束,也未正确配置按钮的内在内容尺寸。虽然你添加了70x80的UIImageView作为背景,但按钮自身的可点击区域(hitTest范围)仅为系统默认的极小尺寸,只有ImageView覆盖到的左上角小部分与该区域重叠,因此只有那部分能响应点击。
解决方案
以下几种方式均可修复,按需选择:
方式一:给按钮添加明确宽高约束
在configPassButton方法中,为按钮添加与ImageView匹配的宽高约束:
func configPassButton() { passButton = PassButton() guard let passButton = passButton else { return } view.addSubview(passButton) passButton.translatesAutoresizingMaskIntoConstraints = false passButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20).isActive = true passButton.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor, constant: 20).isActive = true // 添加宽高约束,匹配ImageView的70x80尺寸 passButton.widthAnchor.constraint(equalToConstant: 70).isActive = true passButton.heightAnchor.constraint(equalToConstant: 80).isActive = true }
方式二:让按钮内在尺寸匹配ImageView
将ImageView改为类属性,并重写intrinsicContentSize返回其尺寸,按钮会自动以此确定自身大小:
class PassButton: UIButton { var videoVC: VideoGameVC? private let imageViewBackground = UIImageView(frame: CGRect(x:0, y:0, width: 70, height: 80)) required init(isEnabled: Bool = false) { super.init(frame: .zero) self.isEnabled = true self.addTarget(self, action: #selector(pressed(_:)), for: .touchUpInside) imageViewBackground.image = UIImage(named: "pass_button") imageViewBackground.contentMode = UIView.ContentMode.scaleAspectFill addSubview(imageViewBackground) sendSubviewToBack(imageViewBackground) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override var intrinsicContentSize: CGSize { return imageViewBackground.frame.size } @objc func pressed(_ sender: UIButton) { print("presovan") } }
更规范的优化方式:直接使用按钮内置图片API
无需手动添加UIImageView,利用UIButton的setBackgroundImage方法设置背景图,按钮会自动处理尺寸与点击区域:
class PassButton: UIButton { var videoVC: VideoGameVC? required init(isEnabled: Bool = false) { super.init(frame: .zero) self.isEnabled = true self.addTarget(self, action: #selector(pressed(_:)), for: .touchUpInside) // 直接设置按钮背景图 let backgroundImage = UIImage(named: "pass_button") self.setBackgroundImage(backgroundImage, for: .normal) // 如需调整内边距可设置contentEdgeInsets // self.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @objc func pressed(_ sender: UIButton) { print("presovan") } }
内容的提问来源于stack exchange,提问作者The Outstanding Question Asker
相关产品推荐
相关产品推荐

