2010-06-30 28 views
5

Làm cách nào tôi thực hiện việc kéo và thả UIView từ UIPopoverController vào mặt sau UIView.Kéo-n-Thả từ UIPopoverController sang UIView

Đây là chức năng mà Trang cung cấp trong cửa sổ phương tiện chèn, nơi bạn có thể kéo hình ra khỏi UIPopoverController và thả nó vào tài liệu chính.

Tôi thực sự nhầm lẫn với pan UIGestureRecognizers và nơi chúng sẽ được triển khai.

Cảm ơn,

Umer

+0

dude tôi đang bối rối .. UIPopoverController và UIGestureRecognizers là gì? Không phải thành phần UIKit chắc chắn. Bạn đang đề cập đến một số chế độ xem tùy chỉnh ... hoặc một số loại chức năng bạn muốn ..? – lukya

+1

@lukya UIPopovercontroller và UIGestureRecognizers là tất cả một phần của UIKit cho Ipad (Uigesturerecognizer là dành cho iphone quá) – Daniel

+0

@Daniel bất kỳ ý tưởng về cách các đối tượng sẽ được cấu trúc? – umerh

Trả lời

6

Bạn phải đối phó với hai quan điểm điều khiển một trong đó là trong nền gọi mainController một được trình bày bằng một UIPopoverViewController gọi popoverController. PopoverController của bạn có thể thêm UIPanGestureRecognizer vào chế độ xem mà người dùng có thể kéo. Mục tiêu hành động của gestureRecognizer có thể là một phương thức trên popoverController.

Khi người dùng bắt đầu thao tác kéo, phương thức hành động của bạn được gọi với gestureRecognizer làm đối số, là trạng thái của gestureRecognizer là UIGestureRecognizerStateBegan. Bạn có thể lưu khung hiện tại của chế độ xem một cách khác biệt để có thể tạo hiệu ứng hoạt ảnh trở lại, khi không thả được. Nó có thể là cần thiết để di chuyển xem đến một superview khác (cửa sổ ví dụ), bởi vì tôi không chắc chắn nếu UIPopoverViewController clipsToBounds xem của nó.

Khi người dùng kéo, phương thức hành động của bạn được gọi đi lặp lại với gestureRecognizer ở trạng thái UIGestureRecognizerStateChanged. Sử dụng phương thức translationInView: trên UIPanGestureRecognizer để xác định số người dùng đã kéo và cập nhật trung tâm chế độ xem/khung hình/chuyển đổi được kéo theo đó.

Sau khi người dùng nhấc ngón tay của mình, phương pháp hành động được gọi lần cuối cùng với trạng thái gestureRecoginzers được đặt thành UIGestureRecognizerStateEnded. Bây giờ là lúc để tìm hiểu xem việc kéo đã thành công hay chưa. Ví dụ, popoverController có thể yêu cầu mainController thông qua ủy nhiệm nếu có một mục tiêu thả dưới vị trí hiện tại của khung nhìn, nếu như vậy mainController có thể thực hiện hành động, thì popoverController sẽ làm sống động chế độ xem đã quay trở lại, và thêm nó trở lại như một subview để xem nó.

Tôi hy vọng điều này bằng cách nào đó dễ hiểu và hữu ích.

+0

Cảm ơn rất nhiều câu trả lời chi tiết. Tôi nghĩ rằng tôi hiểu nó ngay bây giờ. Tại UIGestureRecognizerStateBegan tôi sẽ thêm một UIView mới vào cửa sổ và cuối cùng điều chỉnh mọi thứ trong UIGestureRecognizerStateEnded và loại bỏ UIView từ cửa sổ sẽ là cách để đi cho tôi. Cảm ơn bạn lần nữa. – umerh

7

Theo tài liệu trên UIPopoverController, khi cửa sổ bật lên được trình bày, nó được trình bày trên một "cửa sổ" đặc biệt. Bởi vì điều này, chỉ cần thêm một subview vào bộ điều khiển xem nội dung của trình điều khiển xem popover là không đủ để có thể kéo một khung nhìn ra ngoài khung nhìn của trình điều khiển khung nhìn của khung nhìn.

Giải pháp dễ nhất ở đây là tạo cửa sổ của riêng bạn, thêm chế độ xem có thể kéo vào cửa sổ khi việc kéo xảy ra. Làm cho cửa sổ hiển thị trong suốt thời gian kéo/thả và sau đó nhả cửa sổ của bạn khi hoàn tất.

Như đã đề cập ở trên, trình nhận dạng cử chỉ (GR) phù hợp nhất cho chức năng Kéo/Thả.Khi trạng thái GR đã thay đổi thành "Bắt đầu", GR sẽ kiểm soát tất cả các chạm cho đến khi trạng thái "Đã kết thúc" hoặc "Đã hủy" đạt được, điều này lý tưởng cho việc kéo chế độ xem giữa bộ điều khiển chế độ xem cũng như cửa sổ :)

Ví dụ:

@interface MySplitViewController : UISplitViewController { 

    UIView *dragView; 
    UIWindow *dragWindow; 
} 

Thực hiện: LƯU Ý chúng tôi không cần phải gọi "makeKeyAndVisible" trên cửa sổ của chúng tôi. Chúng tôi chỉ cần đặt thuộc tính "Ẩn" của mình

Từ Apple liên quan đến phương thức makeKeyAndVisible: // tiện lợi. hầu hết các ứng dụng gọi điều này để hiển thị cửa sổ chính và cũng làm cho nó chính. nếu không, hãy sử dụng thuộc tính ẩn chế độ xem

-(void)dragBegan{ 

    self.dragWindow = [[UIWindow alloc] initWithFrame:self.view.window.frame]; 
    [self.dragWindow addSubview:self.dragView]; 
    [self.dragWindow setHidden:NO]; 
} 

Ở đây chúng tôi xử lý trạng thái "Đã kết thúc" hoặc "Đã hủy" của Cử chỉ. LƯU Ý: Điều quan trọng là phải xóa cửa sổ khi Kéo/Thả hoàn tất hoặc bạn sẽ mất tương tác người dùng với các chế độ xem bên dưới.

-(void)dragEnded{ 

    [self.dragView removeFromSuperview]; 

    [self.dragWindow setHidden:YES]; 
    [self.dragWindow release]; 

    [self.view addSubview:self.dragView]; 
} 
Các vấn đề liên quan