2017-02-06 4 views
0

화면의 중간에 topContainerView (오렌지색)와 bottomContainerView (녹색)를 구분하는 검은 분리 뷰가 있습니다. separatorView는 panGesture를 사용하여 위아래로 드래그 할 수 있지만 제약 조건을 업데이트하고 크기를 조정할 수있는 위아래 뷰를 가져올 수 없습니다. 주황색보기의 맨 아래와 녹색보기의 맨 위에는 separatorView가 항상 있어야합니다. 여기 UIPanGestureRecognizer로 제약 조건을 업데이트하십시오.

내가 (변수 선언을 포함하도록 업데이트) 한 코드입니다 :

let separatorView: UIView = { 
 
    let view = UIView() 
 
    view.backgroundColor = UIColor.black 
 
    view.translatesAutoresizingMaskIntoConstraints = false 
 
    return view 
 
}() 
 

 
let topContainerView : UIView = { 
 
    let view = UIView() 
 
    view.backgroundColor = UIColor.orange 
 
    view.translatesAutoresizingMaskIntoConstraints = false 
 
    return view 
 
}() 
 

 
let bottomContainerView : UIView = { 
 
    let view = UIView() 
 
    view.backgroundColor = UIColor.green 
 
    view.translatesAutoresizingMaskIntoConstraints = false 
 
    return view 
 
}() 
 

 
override func viewDidLoad() { 
 
     super.viewDidLoad() 
 
     self.addViews() 
 
     let panGesture = UIPanGestureRecognizer(target: self, action: #selector(detectPan(recognizer:))) 
 
     panGesture.delaysTouchesBegan = false 
 
     panGesture.delaysTouchesEnded = false 
 
     separatorView.addGestureRecognizer(panGesture) 
 
    } 
 

 
    override func didReceiveMemoryWarning() { 
 
     super.didReceiveMemoryWarning() 
 
     // Dispose of any resources that can be recreated. 
 
    } 
 
    
 
    func addViews() { 
 
     
 
     view.addSubview(topContainerView) 
 
     view.addSubview(bottomContainerView) 
 
     view.addSubview(separatorView) 
 
     
 
     separatorView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
 
     separatorView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 
 
     separatorView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
 
     separatorView.heightAnchor.constraint(equalToConstant: 50).isActive = true 
 
     
 
     topContainerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
 
     topContainerView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 
 
     topContainerView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
 
     topContainerView.bottomAnchor.constraint(equalTo: separatorView.topAnchor).isActive = true 
 
     
 
     bottomContainerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
 
     bottomContainerView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 
 
     bottomContainerView.topAnchor.constraint(equalTo: separatorView.bottomAnchor).isActive = true 
 
     bottomContainerView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
 
    } 
 
    
 
    func detectPan(recognizer: UIPanGestureRecognizer) { 
 
     let translation = recognizer.translation(in: self.view) 
 
     separatorView.center = CGPoint(x: view.center.x, y: lastLocation.y + translation.y) 
 
    } 
 
    
 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
 
     self.view.bringSubview(toFront: separatorView) 
 
     lastLocation = separatorView.center 
 
    }

enter image description here

enter image description here

+0

뷰의 'translatesAutoresizingMaskIntoConstraints'를'false '로 설정 했습니까? – Honey

+0

각보기마다 – kerbelda

+0

어디에서 했습니까? 나는 당신의 코드에서 그것을 볼 수 없다. – Honey

답변

3

것은 당신이 자동 레이아웃을 사용하는 당신은 할 수 없습니다 단순히 요소의 프레임 수정 (암시 적으로 수행하는 작업) center 속성을 변경하여). 음, 할 수는 있지만 다른 요소에는 영향을 미치지 않으며 Autolayout이 트리거되면 프레임 변경 사항이 재설정됩니다.

제약 조건을 조작해야 Autolayout에서 원하는 결과를 얻을 수 있습니다.

이 경우 구분 기호를보기 중앙에 묶는 제한 조건의 constant 속성을 수정해야합니다. 팬 제스처 인식기의 변환 값을 사용하여이를 수행 할 수 있습니다. 유일한 까다로운 점은이 변환이 팬의 시작 부분에서 0에 상대적이므로 모든 이전 팬의 오프셋을 통합해야한다는 것입니다.

let separatorView: UIView = { 
    let view = UIView() 
    view.backgroundColor = UIColor.black 
    view.translatesAutoresizingMaskIntoConstraints = false 
    return view 
}() 

let topContainerView : UIView = { 
    let view = UIView() 
    view.backgroundColor = UIColor.orange 
    view.translatesAutoresizingMaskIntoConstraints = false 
    return view 
}() 

let bottomContainerView : UIView = { 
    let view = UIView() 
    view.backgroundColor = UIColor.green 
    view.translatesAutoresizingMaskIntoConstraints = false 
    return view 
}() 

var centerConstraint: NSLayoutConstraint! 

var startingConstant: CGFloat = 0.0 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.addViews() 
    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(detectPan(recognizer:))) 
    panGesture.delaysTouchesBegan = false 
    panGesture.delaysTouchesEnded = false 
    separatorView.addGestureRecognizer(panGesture) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func addViews() { 

    view.addSubview(topContainerView) 
    view.addSubview(bottomContainerView) 
    view.addSubview(separatorView) 

    separatorView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
    separatorView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 

    self.centerConstraint = separatorView.centerYAnchor.constraint(equalTo: view.centerYAnchor) 
    self.centerConstraint.isActive = true 

    separatorView.heightAnchor.constraint(equalToConstant: 50).isActive = true 

    topContainerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
    topContainerView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 
    topContainerView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
    topContainerView.bottomAnchor.constraint(equalTo: separatorView.topAnchor).isActive = true 

    bottomContainerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
    bottomContainerView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 
    bottomContainerView.topAnchor.constraint(equalTo: separatorView.bottomAnchor).isActive = true 
    bottomContainerView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
} 

func detectPan(recognizer: UIPanGestureRecognizer) { 

    switch recognizer.state { 
    case .began: 
     self.startingConstant = self.centerConstraint.constant 
    case .changed: 
     let translation = recognizer.translation(in: self.view) 
     self.centerConstraint.constant = self.startingConstant + translation.y 
    default: 
     break 
    } 
} 
+0

그래, 내가 끝내 준거야. 센터 수정은 다른 것을 업데이트하지 않았습니다. centerYAnchor 상수를 수정해야했습니다. 감사! – kerbelda

관련 문제