2017-09-15 5 views
1

제스처가 인식되지 않고 UIView에 탭 제스처를 추가하려고합니다.제스처 이벤트가 UIView에서 작동하지 않습니다.

"iconBadgeView"는 매개 변수에 전달 된 정의 된 크기의 이미지가있는 UIView입니다.

lazy var cardioVascularIcon : IconBadgeView! = { 

    let iconBadgeView = IconBadgeView(frame: CGRect(x: 0, y: 0, width: 95, height: 95), data:["big":"db_history"]) 

    let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:))) 

    tapEvent.numberOfTapsRequired = 1 
    iconBadgeView.translatesAutoresizingMaskIntoConstraints = false 

    iconBadgeView.isUserInteractionEnabled = true  
    iconBadgeView.addGestureRecognizer(tapEvent) 
}() 

는 같은 클래스에 부착 된 위임자가 및 기능은 다음과 같이 구현됩니다

func loadNewView(sender: UITapGestureRecognizer) { 
    print("Tapped") 
} 

함수 loadNewView가 호출 받고 있지 않습니다. 나는 코드에서 무엇이 잘못되었는지 확신하지 못한다. 누군가가 도울 수 있으면 제발.

나는 아래와 같은 수퍼에 iconBadgeView를 추가하고 : 그것은 지역 변수이기 때문에

override init(frame: CGRect) { 
    super.init(frame: CGRect.zero) 

    addSubview(cardioVascularIcon) 

    cardioVascularIcon.pinToSuperview([.Top]) 
    cardioVascularIcon.pinToSuperview([.Left], constant: 92) 
    cardioVascularIcon.pinToSuperview([.Right], constant: 92) 
} 
+0

'tapEvent = UITapGestureRecognizer (목표 보자 : 자기 행동 : #selector (loadNewView (보낸 사람이 :))) tapEvent.addTarget (iconBadgeView, 액션 을 : #selector (loadNewView (보낸 사람이 :))) '왜 반복된다 여기 내 친구 롤. 'UITapGestureRecognizer()'를 의미하는'default constructor '을 가진 제스처를 만들려면'addTarget' 메소드에 selector를 제공해야합니다.하지만 selector와 target을 필요로하는 커스텀 생성자를 사용하고 있기 때문에 그 코드의 두 번째 라인을 가지고 :) – Lamar

+0

중복 라인을 제거하려고 노력했지만 도움이되지 않았다 – user2122178

+0

어떤 오류/문제가 있었나요? 그냥 호기심에 의해 당신의 superView에'iconBadgeView'를 추가 했습니까? 또한'translatesAutoresizingMaskIntoConstraints'를 비활성화 했으므로 화면 상에있는 것으로 생각할 수도 있고 그렇지 않다면 다음 제약 조건을 추가해야합니다 :) – Lamar

답변

1

문제의 해결 방법이 있습니다. Label 대신 버튼을 사용 했으므로 모든 것이 올바르게 작동합니다. 아래는 내가 사용하고있는 코드입니다 :

func createButton (buttonWidth : CGFloat?, buttonTitle : String?, buttonFont : UIFont?, imageName : String?, buttonColor : UIColor?) -> UIButton { 
    let newButton = UIButton(type: . custom) 
    newButton.showsTouchWhenHighlighted = false 
    newButton.translatesAutoresizingMaskIntoConstraints = false 
    newButton.adjustsImageWhenHighlighted = false 

    if let title = buttonTitle { 
     newButton.setTitle(title, for: .normal) 
    } 
    if let color = buttonColor { 
     if let _ = newButton.titleLabel { 
      newButton.setTitleColor(color, for: .normal) 
     } 
    } 

    if let btnWidth = buttonWidth { 
     newButton.frame = CGRect(x: 0, y: 0, width: btnWidth, height: btnWidth) 
     newButton.layer.cornerRadius = 0.5 * newButton.bounds.size.width 
     newButton.clipsToBounds = true 
    } 
    if let img = imageName { 
     newButton.setImage(UIImage(named: img), for: .normal) 
    } 
    if let font = buttonFont { 
     newButton.titleLabel?.font = font 
    } 

    return newButton 
} 
let addDiagButton = self.createButton(buttonWidth: nil, buttonTitle: addButtonTitle, buttonFont: UIFont.regularDisplayOfSize(30), imageName: nil, buttonColor: UIColor(red: 111, green: 160, blue: 186)) 

addDiagButton.addTarget(self, action: #selector(addDiag(sender:)), for: .touchUpInside) 

위의 코드는 버튼을 생성하고 트리거 이벤트를 첨부하는 공통 기능을 가지고 있습니다. 코드는 잘 작동합니다.

레이블을 클릭하는 것처럼 동작하게하려면 createButton 함수에 행을 추가해야합니다.

newButton.adjustsImageWhenHighlighted = 거짓

클릭 할 때이 버튼의 플래시 효과가 제한됩니다.

0

귀하의 iconBadgeView는 사라집니다.

초기화해야합니다 cardioVascularIcon var.

lazy var cardioVascularIcon : IconBadgeView! = { 

    cardioVascularIcon.frame = CGRect(x: 0, y: 0, width: 95, height: 95) 
    //here call function which sets data property 

    let tapEvent = UITapGestureRecognizer(target: self, action: #selector(loadNewView(sender:))) 

    tapEvent.numberOfTapsRequired = 1 
    cardioVascularIcon.translatesAutoresizingMaskIntoConstraints = false 

    cardioVascularIcon.isUserInteractionEnabled = true  
    cardioVascularIcon.addGestureRecognizer(tapEvent) 
}() 
+0

고마워. 답을 얻었지만 작동하지 않는 것이 두려웠습니다. – user2122178

+0

보기가 화면에 표시됩니까? 이 새로운보기를보기 계층에 추가하는 누락 된 코드가 있습니다. – Dan

+0

예,보기가 화면에 표시됩니다. – user2122178