2016-11-10 1 views
0

해당 이미지에 하나의 이미지 뷰와 텍스트 필드가 있습니다. 아래의 코드로 텍스트 필드를 드래그 가능하게 만들지 만 화면의 어느 곳으로나 드래그 할 수 있습니다. 그 텍스트 필드는 이미지 뷰의 한계 내에서만 드래그 가능하게하고 싶습니다. draagedView 함수를 체크 인하면 주석을 제거하면 x 값이 같아지기 때문에 textfield가 imageview의 왼쪽에 붙어 있습니다.Swift에서 드래그 가능한 항목으로 한도 설정

이 솔루션을 발견했지만 내 프로젝트에서 작동하도록 수정할 수 없습니다. Use UIPanGestureRecognizer to drag UIView inside limited area

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let gesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView(_:))) 
    bottomTextField.addGestureRecognizer(gesture) 
    bottomTextField.isUserInteractionEnabled = true 
} 
    func userDragged(gesture: UIPanGestureRecognizer){ 
    let loc = gesture.location(in: self.view) 
    self.bottomTextField.center = loc 
} 
func draggedView(_ sender:UIPanGestureRecognizer) { 
    let compare = MyimageView.frame.maxX <= bottomTextField.frame.maxX 
    //if(MyimageView.frame.minX <= bottomTextField.frame.minX && compare) 
    // { 
    self.view.bringSubview(toFront: sender.view!) 
    let translation = sender.translation(in: self.view) 
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) 
    sender.setTranslation(CGPoint.zero, in: self.view) 

    // } 
} 

답변

0

가장 큰 문제 당신이 번역을 전에 위치 를 확인하는 것입니다. 이는 텍스트 필드가 유효하지 않은 위치에서 끝나고 그 후에는 if 블록에 도달하지 못했음을 의미합니다.

이 문제를 접근하는 약간 다른 방법이며 텍스트 필드를 잘 한계의 가장자리에 도달하는 것을 의미한다 :

func draggedView(_ sender: UIPanGestureRecognizer) { 

    guard let senderView = sender.view else { 
    return 
    } 

    var translation = sender.translation(in: view) 

    translation.x = max(translation.x, MyimageView.frame.minX - bottomTextField.frame.minX) 
    translation.x = min(translation.x, MyimageView.frame.maxX - bottomTextField.frame.maxX) 

    translation.y = max(translation.y, MyimageView.frame.minY - bottomTextField.frame.minY) 
    translation.y = min(translation.y, MyimageView.frame.maxY - bottomTextField.frame.maxY) 

    senderView.center = CGPoint(x: senderView.center.x + translation.x, y: senderView.center.y + translation.y) 
    sender.setTranslation(.zero, in: view) 
    view.bringSubview(toFront: senderView) 
} 

나는 또한 guard 문에서를 추가하여 좀 더 안전한 만든 언론의 힘을 제거하고 제거합니다.

+0

텍스트 필드의 위치를 ​​변경하고 변경하면 텍스트 필드가 이미지보기의 가운데로 다시 이동합니다. 나는 그것이 그곳에 머물러 있기를 바랍니다. 어떻게 해결할 수 있습니까? 고맙습니다! –

+0

번역을 재정의하는 자동 레이아웃 제한 조건 일 수 있습니다. 나는 이것을 새로운 질문으로 제기 할 것이다. – ganzogo

관련 문제