5

Tôi đang làm cho một trò chơi iOS và tôi muốn đạt được hiệu ứng này: pause popup 2 different controllersLàm thế nào để tạo cửa sổ bật lên/hộp thoại trong iOS trong một ViewController riêng biệt?

tôi biết làm thế nào để làm điều đó bằng một cái nhìn khiển nhưng lớp view controller của tôi là đã cồng kềnh với mã và các kịch bản của màn hình đó là một mớ hỗn độn (Tôi thực sự có nhiều quan điểm hơn rằng hình ảnh ở trên, tôi chỉ giấu chúng vì lý do rõ ràng).

Vì vậy, câu hỏi của tôi là: Có cách nào để đạt được điều này bằng cách sử dụng bộ điều khiển chế độ xem riêng biệt để quản lý cửa sổ tạm dừng này không? Tôi cần một segue mà sẽ không bỏ qua màn hình trình bày trước đó. Tôi muốn làm điều đó bằng cách sử dụng bảng phân cảnh. Tôi đã cố gắng "popover" segue nhưng nó xuất hiện với một biên giới kỳ lạ mà tôi không muốn.

Ngoài ra tôi cần tất cả các điều khiển không được quản lý bởi bộ điều khiển xem tạm dừng dừng nghe sự kiện. Tôi đã nghĩ đến việc sử dụng chế độ xem trong suốt màu đen bao phủ toàn bộ màn hình dưới dạng BG cho chế độ xem tạm dừng và làm cho nó bỏ qua các sự kiện. Có cách tiếp cận tốt hơn không?

Xin cảm ơn trước.

Trả lời

16

Nếu bạn muốn đạt được nó bằng bảng phân cảnh, nó khá đơn giản.

tôi đính kèm example code

1 - Tạo PauseViewController tùy chỉnh của bạn trong Storyboard. Sử dụng chế độ xem toàn màn hình, màu đen, với Alpha 0 và chế độ xem phụ chứa các điều khiển tạm dừng của bạn. Tạo các tệp .h và .cores .ondo.

2 - thêm và liên kết các điều khiển của bạn (UIButtons). Thêm phương thức loại bỏ như thế này. Phương pháp này sẽ xóa chế độ xem khỏi cấu trúc phân cấp và làm cho nó không hiển thị thay đổi alpha khi loại bỏ.

- (IBAction)dismiss:(id)sender { 
    [UIView animateWithDuration:0.3f animations:^{ 
     self.view.alpha = 0.0f; 
    } completion:^(BOOL finished) { 
     [self.view removeFromSuperview]; 
     [self removeFromParentViewController]; 
    }]; 
} 

3 - lớp con UIStoryboardĐăng ký tạo lớp segue của riêng bạn. Sau đó, ghi đè lên phương thức thực hiện với một cái gì đó như thế này. Điều này chỉ đơn giản là có hai bộ điều khiển (nguồn và đích) và đặt chế độ xem đích trên chế độ xem nguồn với hoạt ảnh.

-(void)perform{ 
    UIViewController *dst = [self destinationViewController]; 
    UIViewController *src = [self sourceViewController]; 

    // add the view to the hierarchy and bring to front 
    [src addChildViewController:dst]; 
    [src.view addSubview:dst.view]; 
    [src.view bringSubviewToFront:dst.view]; 

    // set the view frame 
    CGRect frame; 
    frame.size.height = src.view.frame.size.height; 
    frame.size.width = src.view.frame.size.width; 
    frame.origin.x = src.view.bounds.origin.x; 
    frame.origin.y = src.view.bounds.origin.y; 
    dst.view.frame = frame; 

    [UIView animateWithDuration:0.3f animations:^{ 
     dst.view.alpha = 0.5f; 
    }]; 
} 

4 - liên kết phân đoạn của bạn, chọn tùy chỉnh và chèn tên phân biệt tùy chỉnh.

Ta-daaaa!

Nếu bạn cần các chi tiết khác, hãy kiểm tra mã mẫu hoặc thêm nhận xét.

+0

Điều này giống như tạo bộ điều khiển vùng chứa. Bạn không cần phải làm điều này khi ios đã cung cấp cho bạn bộ điều khiển vùng chứa. Xem câu trả lời của tôi dưới đây –

+0

Ông yêu cầu cụ thể cho một giải pháp phân biệt tùy chỉnh. Điều này là sạch sẽ và tái sử dụng: ông có thể kích hoạt các segue từ bất kỳ viewController (nếu cần thiết), hoặc chỉ có thể tái sử dụng segue tùy chỉnh để trình bày vc khác. nó tách phần hoạt hình (chuyển đổi segue) khỏi mã điều khiển. Tách là chìa khóa để một mã sạch hơn và duy trì. – LombaX

+0

Để rõ ràng hơn, anh ta yêu cầu một cái gì đó không được nhúng vào trong cảnh ban đầu, để tránh làm phức tạp hơn. Vì vậy, ông đặt một hạn chế về các giải pháp có thể. Nếu không, giải pháp đơn giản hơn là chỉ thêm một phần phụ (không phải toàn bộ vc) và hiển thị/ẩn khi cần. – LombaX

2

Bạn nên xem xét childViewControllers. Có vẻ như bạn muốn đạt được điều gì đó như thế này.

PauseMenuViewController *pauseMenuVC = [[PauseMenuViewController alloc] init]; 
[self addChildViewController:pauseMenuVC]; 
if ([self isViewLoaded]){ 
    [self.view addSubview:pauseMenuVC.view]; 
} 

Bạn sẽ có thể tạo hoạt ảnh của riêng mình của menu vào chế độ xem và làm mờ nền.

Apple Docs

0

Giả sử bạn không sử dụng cảnh coco 2d. Trong iOS đơn giản, giải pháp posiible tốt nhất đang sử dụng Bộ điều khiển vùng chứa.

  1. Tới bảng câu chuyện của bạn và kéo một bộ điều khiển container để điều khiển của bạn chính view (giống như bạn kéo một UILabel)
  2. Thiết lập kích thước của container. Một chế độ xem nhúng khác sẽ bật ra khỏi bộ điều khiển vùng chứa có cùng kích thước. Cung cấp cho bộ điều khiển xem này một tên lớp mới.
  3. tạo lối thoát cho vùng chứa và hiển thị/ẩn vùng chứa theo yêu cầu.

Nếu bạn không thể làm điều này, tôi sẽ thực hiện một hướng dẫn trên trang web này. Chỉ cần bình luận dưới đây nếu bạn muốn tôi làm điều đó.

+0

i'am làm việc trên một proj đơn giản, tôi muốn tạo một bộ điều khiển container và tải một trang html5 bên trong để bạn có thể giúp tôi với điều đó, tôi có một số điểm kinh nghiệm trên html 5 nhưng không phải trong ios dev, vì vậy có thể bạn giúp tôi với một ví dụ hoặc hướng dẫn đơn giản. – dreamweiver

0

Là một biến thể cho câu trả lời liên quan đến lớp con UIStoryboardSegue, bạn cũng có thể sử dụng hình ảnh 1x1 "blank.png" trong suốt. Bằng cách đó, bạn chỉ cần quan tâm đến bản thân với các chữ cái của các bản xem trước của trình điều khiển chế độ xem của cửa sổ bật lên, để cửa sổ bật lên ở giữa có thể có khả năng hiển thị đầy đủ nếu muốn.

-(void)perform 
    { 
     UIViewController *dst = [self destinationViewController]; 
     UIViewController *src = [self sourceViewController]; 

     // add the view to the hierarchy and bring to front 
     [src addChildViewController:dst]; 
     [src.view addSubview:dst.view]; 
     [src.view bringSubviewToFront:dst.view]; 

     // set the view frame 
     CGRect frame; 
     frame.size.height = src.view.frame.size.height; 
     frame.size.width = src.view.frame.size.width; 
     frame.origin.x = src.view.bounds.origin.x; 
     frame.origin.y = src.view.bounds.origin.y; 
     dst.view.frame = frame; 
     dst.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"blank.png"]]; 

     [UIView animateWithDuration:0.3f animations:^{ 
      dst.view.alpha = 1; 
     }]; 
    } 
Các vấn đề liên quan