2016-11-23 1 views
3

나는 이것을 작동 시키려고 노력 중이다. 이것은 Uber App입니다. 사용자가 배경보기 앞에서 다른보기를 위로 스 와이프 할 수있는 곳입니다. UITableViewController를 다른 ViewController 앞에 스 와이프 제스처로 표시하는 방법은 무엇입니까?

enter image description here

배경보기

은 이미 완료되었습니다, 매우 간단하다. 위에 스 와이프 될 뷰는 UITableView가 될 것입니다. 사용자가 응용 프로그램이 시작될 때 가장 먼저 작은 부분을 볼 수있게하고 싶습니다. 그러면 중간에 멈추어야하고 조금 위로 스 와이프 한 다음 완전히 위로 스 와이프 한 후 상단으로 끝까지 가져 가야합니다. 배경을 대체해야합니다. 전망.

내가 본 프레임 워크는 iOS 용 풀 뷰입니다. 그러나 그것은 너무 오래되었고 멋진 애니메이션을 얻지 못합니다. 나는 또한 SWRevealViewController 보았다하지만 아래에서 위로 스 와이프하는 방법을 알아낼 수 없습니다.

사용자가 클릭 할 때 단추를 사용하려고 했으므로 테이블보기 컨트롤러가 모달로 표시되어 세로로 표시되지만 원하는 것은 아닙니다. 제스처를 알아야합니다.

도움을 주시면 대단히 감사하겠습니다. 감사.

편집 : 미래의 누군가가 더 나은 구현 방법을 사용한다면 답을 받아들이지 않을 것입니다. 내 대답은 작동하지만 개선 될 수 있습니다. 게다가, 내 원래의 질문이었던 Uber 앱에서 진행되는 것과 같이 평평하지 않습니다.

답변

1

테이블 뷰 파트를 터치 한 다음 (히트 테스트 우선 순위) 테이블 뷰를 터치 (테이블 뷰 스크롤을 비활성화)하고 스크롤 뷰를 비활성화 할 때만 터치를 처리하는 사용자 정의 스크롤 뷰에 해당 테이블 뷰를 포함시킬 수 있습니다. 있는 tableview 스크롤 다시

을 사용하거나, 당신은 당신의 tableview에 슬쩍 제스처를 추가하고 그것이 사람들과 상단

실험에 도달 함께 프레임을 사용하지 않도록 슬쩍의 변경하고 결국 당신이

을 원하는 효과를 달성 할 수 있습니다
1

Tj3n이 지적했듯이를 사용할 수 있습니다.을 입력하면 UITableView이 표시됩니다. 따라서 프레임 대신 구속 조건을 사용하면 다음과 같이 할 수 있습니다.

UITableView을 표시하려는 스토리 보드 내부의 UIViewController으로 이동하십시오. UITableView을 끌어다 놓고 UITableView에 선행, 후행 및 높이를 추가하십시오. 이제 UIViewControllerUITableView 사이에 수직 제약 조건을 추가하여 UITableView이 아래에 으로 표시되고 UIViewController (사용자의 필요에 맞게 UITableView의 상단 부분을 표시 할 수있을 때까지이 수직 값으로 재생하십시오.) 세로 간격 제한 및 높이 제한에 대한 콘센트를 만듭니다 (런타임시 계산할 수있는 특정 높이를 설정해야하는 경우). 슬쩍 최대 단지 animatedly 등의 높이 종류의 음의 값을 동일하게 수직 제약 조건을 설정합니다

topSpaceToViewControllerConstraint.constant = -mainTableViewHeightConstraint.constant 

UIView.animate(withDuration: 0.3) { 

    view.layoutIfNeeded() 
}; 

당신이 따라를 UITableView을 가져올 수 있도록하려면 다른 방법

팬 양 (즉,사용자가 화면을 얼마나 많이 움직 였는지에 따라) UIPanGestureRecognizer을 대신 사용하고 UITableView의 autoLayout 대신 프레임을 설정해야합니다 (나는 반복적으로 view.layoutIfNeeded을 호출하는 팬이 아닙니다.) 나는 어딘가에서 읽었습니다. 누군가가 이것을 확인하거나 고치면 값 비싼 조작이라고 인정할 것입니다). 다른 방법으로 수행 할 것을 수행을있는 UITableViewController

를 사용

func handlePan(sender: UIPanGestureRecognizer) { 

     if sender.state == .Changed { 
       //update y origin value here based on the pan amount 
     } 
    } 

은 당신이 원할 경우 UITableViewController를 사용하는 것도 가능하지만 주로를 생성하는 사용자 정의 UINavigationControllerDelegate을 만들어 날조과 노력이 많이 포함 사용자 정의 애니메이션은 UIPercentDrivenInteractiveTransition을 사용하여 팬 금액에 따라 원하는 경우 UIPanGestureRecognizer을 사용하여 새 UITableViewController을 당깁니다. 그렇지 않으면 단순히 UISwipeGestureRecognizer을 추가하여 UITableViewController을 표시 할 수 있지만 원하는 효과를 "가짜"로 만드는 사용자 지정 애니메이션을 다시 만들어야합니다.

+0

감사합니다.이 문제를 해결하고 다시 신고하겠습니다. – Munib

1

Rikh와 Tj3n에게 도움을 주신 데 대해 감사드립니다. 나는 아주 기본적인 것을 해냈습니다. Uber와 같은 멋진 애니메이션이 아니지만 일을 끝내게됩니다.

다음 코드를 사용하면 UIViewController를 스 와이프 할 수 있습니다. 내 이미지에 UIPanGestureRecognizer를 사용합니다.이 이미지는 항상 드래그 된 뷰 위에 유지됩니다. 기본적으로 이미지를 사용하면 드래그 한 위치를 인식하고 사용자의 입력에 따라보기 프레임을 설정합니다.

먼저 스토리 보드로 이동하여 드래그 할 UIViewController의 식별자를 추가하십시오.

enter image description here

는 그 다음 MainViewController에 다음 코드를 사용

class MainViewController: UIViewController { 

// This image will be dragged up or down. 
@IBOutlet var imageView: UIImageView! 

// Gesture recognizer, will be added to image below. 
var swipedOnImage = UIPanGestureRecognizer() 

// This is the view controller that will be dragged with the image. In my case it's a UITableViewController. 
var vc = UIViewController() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // I'm using a storyboard. 
    let sb = UIStoryboard(name: "Main", bundle: nil) 

    // I have identified the view inside my storyboard. 
    vc = sb.instantiateViewController(withIdentifier: "TableVC") 

    // These values can be played around with, depending on how much you want the view to show up when it starts. 
    vc.view.frame = CGRect(x: 0, y: self.view.frame.height, width: self.view.frame.width, height: -300) 


    self.addChildViewController(vc) 
    self.view.addSubview(vc.view) 
    vc.didMove(toParentViewController: self) 

    swipedOnImage = UIPanGestureRecognizer(target: self, action: #selector(self.swipedOnViewAction)) 
    imageView.addGestureRecognizer(swipedOnImage) 

    imageView.isUserInteractionEnabled = true 

} 

// This function handles resizing of the tableview. 
func swipedOnViewAction() { 

    let yLocationTouched = swipedOnImage.location(in: self.view).y 

    imageView.frame.origin.y = yLocationTouched 

    // These values can be played around with if required. 
    vc.view.frame = CGRect(x: 0, y: yLocationTouched, width: UIScreen.main.bounds.width, height: (UIScreen.main.bounds.height) - (yLocationTouched)) 
    vc.view.frame.origin.y = yLocationTouched + 50 

} 

최종 제품 이제

enter image description here

을, 그것은 가능하다 내 대답은하지 않을 수있는 가장 효율적인 방식으로 진행하지만 iOS를 처음 접했을 때 당분간은 이것이 최고라고 생각합니다.

+0

'swipedDiscoveries' 란 무엇입니까? – Edu

+0

@Edu 죄송합니다, UIPanGestureRecognizer를 스 와이프해야합니다. 프로젝트에서 발견 한 것을 보여 주려고했는데 이름을 바꾸는 걸 잊었습니다. 감사합니다 – Munib

+0

, 많이 설명 드리겠습니다, 감사합니다! – Edu