サイズを指定しないとUIGestureRecognizerが機能しない問題を解決したいです。
プロフィール編集画面の実装において UIImageView や UIView に UITapGestureRecognizer を乗っけたのですが一部が機能せず、色々と問題を探したところサイズを指定していないオブジェクトのみに問題が発生することがわかりました。
今回問題が発生したオブジェクトは constraintで大きさを決めているのですが、オートレイアウトの問題で明確なサイズは指定したくない状況です。 (constraint + heightのみ指定 の場合でもダメでした)
オブジェクトの大きさが未確定なのが問題なのかと思い、オブジェクトをaddSubviewさせた後に UITapGestureRecognizer を実装したのですがそれでもダメでした。。。
オブジェクトのサイズを指定せずにconstraintのみでも UIGestureRecognizer を機能させる方法があれば教えていただきたいです。
よろしくお願いします。
private let backgroundImageView: UIImageView = { let iv = UIImageView() iv.contentMode = .scaleAspectFill iv.clipsToBounds = true iv.image = UIImage(named: "background") iv.isUserInteractionEnabled = true return iv }() private let mask1View: UIView = { let view = UIView() view.backgroundColor = UIColor(white: 0, alpha: 0.3) return view }() private let camera1Button: UIButton = { let button = UIButton(type: .system) button.setImage(UIImage(named: "camera")?.withRenderingMode(.alwaysTemplate), for: .normal) button.tintColor = .white button.setDimensions(width: 30, height: 30) button.addTarget(self, action: #selector(handleBackgroundChange), for: .touchUpInside) return button }() lazy var profileImageView: UIImageView = { let iv = UIImageView() iv.contentMode = .scaleAspectFill iv.clipsToBounds = true iv.setDimensions(width: 90, height: 90) iv.layer.cornerRadius = 45 iv.layer.borderWidth = 5 iv.layer.borderColor = UIColor.white.cgColor iv.isUserInteractionEnabled = true return iv }() private let mask2View: UIView = { let view = UIView() view.backgroundColor = UIColor(white: 0, alpha: 0.3) view.setDimensions(width: 80, height: 80) view.layer.cornerRadius = 40 return view }() private let camera2Button: UIButton = { let button = UIButton(type: .system) button.setImage(UIImage(named: "camera")?.withRenderingMode(.alwaysTemplate), for: .normal) button.tintColor = .white button.setDimensions(width: 30, height: 30) button.addTarget(self, action: #selector(handleSelectImage), for: .touchUpInside) return button }() private let underlineView: UIView = { let view = UIView() view.backgroundColor = .systemGroupedBackground return view }() // MARK: - Lifecycle init(user: User) { self.user = user super.init(frame: .zero) configureUI() configure() configureGestureRecgnizer() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - Selector @objc func handleSelectImage() { delegate?.selectImage() } @objc func handleBackgroundChange() { delegate?.selectBackgroundImage() } // MARK: - Helper func configureUI() { addSubview(backgroundImageView) backgroundImageView.anchor(top: topAnchor, left: leftAnchor, right: rightAnchor, height: 160) addSubview(mask1View) mask1View.anchor(top: backgroundImageView.topAnchor, left: backgroundImageView.leftAnchor, bottom: backgroundImageView.bottomAnchor, right: backgroundImageView.rightAnchor) addSubview(camera1Button) camera1Button.centerX(inView: backgroundImageView) camera1Button.centerY(inView: backgroundImageView) addSubview(profileImageView) profileImageView.anchor(top: backgroundImageView.bottomAnchor, left: leftAnchor, paddingTop: -35, paddingLeft: 20) addSubview(mask2View) mask2View.centerX(inView: profileImageView) mask2View.centerY(inView: profileImageView) // addSubview(camera2Button) camera2Button.centerX(inView: profileImageView) camera2Button.centerY(inView: profileImageView) addSubview(underlineView) underlineView.anchor(left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, height: 1) } func configure() { profileImageView.sd_setImage(with: URL(string: user.profileImageUrl), completed: nil) } func configureGestureRecgnizer() { let backgroundTap = UITapGestureRecognizer(target: self, action: #selector(handleBackgroundChange)) let profileTap = UITapGestureRecognizer(target: self, action: #selector(handleSelectImage)) backgroundImageView.addGestureRecognizer(backgroundTap) mask1View.addGestureRecognizer(backgroundTap) profileImageView.addGestureRecognizer(profileTap) mask2View.addGestureRecognizer(profileTap) }
※ anchor()とsetDimensions()はこちらで拡張実装した変数です。
変数の定義内でaddGestureRecognizerをしてもダメでした。
回答1件
あなたの回答
tips
プレビュー