2011-07-11 46 views
6

Trong ví dụ this.Hoạt ảnh khung UIView, chế độ xem phụ UIScrollView không phải lúc nào cũng hoạt ảnh

Tôi đang tạo hoạt ảnh cho khung của PhotoViewerViewController khi tôi tạo hiệu ứng cho tabBarController (để có hiệu ứng toàn màn hình). PhotoViewer sử dụng uiscrollview để tạo ra cùng một loại hiệu ứng ứng dụng ảnh của Apple. Vì lý do gì đó đôi khi nó hoạt hình cùng với khung PhotoViewer của tôi, và đôi khi nó không.

Bạn có thể thấy trong ví dụ đầu tiên nó nhảy khi tăng kích thước khung hình nhưng hoạt ảnh độc đáo khi giảm kích thước khung hình (và khôi phục thanh tab).

Tuy nhiên, trong ví dụ this khi ảnh ở dọc, nó nhảy theo cả hai hướng.

Trong cả hai trường hợp, nếu tôi phóng to ảnh toàn cảnh bằng chế độ xem cuộn, nó sẽ hoạt ảnh chính xác theo cả hai hướng.

Tôi biết bằng chứng là có, nhưng tôi không thể đặt ngón tay của mình vào những gì đang xảy ra ở đây.

Dưới đây là khối hoạt hình của tôi:

void (^updateProperties) (void) =^{ 
    self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f; 
    self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; 
    if (self.tabBarController) { 

     int height = self.tabBarController.tabBar.bounds.size.height; 
     for(UIView *view in self.tabBarController.view.subviews) 
     { 
      int newHeight; 
      UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
      if (UIInterfaceOrientationIsPortrait(orientation)) { 
       newHeight = hidden ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.height - height; 
      } else { 
       newHeight = hidden ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.width - height; 
      } 


      if([view isKindOfClass:[UITabBar class]]) 
      { 
       [view setFrame:CGRectMake(view.frame.origin.x, newHeight, view.frame.size.width, view.frame.size.height)]; 
      } 
      else 
      { 
       CGRect newFrame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, newHeight); 
       [view setFrame:newFrame]; 

       // update our VC frame with animation 
       [self.view setFrame:newFrame]; 

      } 

     } 
    } 

}; 

Mã chuyển thể từ một bài đăng trên SO: UITabBar wont hide

nguồn đầy đủ về github.

Trả lời

6

Nói chung, nếu hình ảnh động đôi khi làm việc và đôi khi don' t, đó là bởi vì trong trường hợp thứ hai, hiệu suất bị trì hoãn đang khiến chúng bị hủy bỏ hiệu quả bằng cách đặt thuộc tính liên quan đến giá trị cuối cùng của nó.

Trong trường hợp cụ thể là UIScrollView thường xảy ra rằng -layoutSubviews được gọi là không có hoạt ảnh chạy vòng lặp sau khi khối hoạt ảnh của bạn đã đóng. Vì lý do này, tôi thường cố gắng tránh thực hiện bất kỳ bố cục nào trong phương thức đó, trong đó tôi có một số UIScrollView trong cấu trúc phân cấp (vì trước khi iOS 5, UIScrollView thực sự kích hoạt khi cài đặt chính nó để cần bố cục).

Tôi khuyên bạn nên xóa cuộc gọi của mình thành -[EGOPhotoImageView layoutScrollViewAnimated:] từ -layoutSubviews và thêm số này vào số điện thoại bị ghi đè -setFrame:.

Nếu bạn có thể nhắm mục tiêu iOS4 trở lên, hãy xem UIViewAnimationOptionLayoutSubviews quá. Sử dụng hoạt ảnh dựa trên khối với tùy chọn này có thể chỉ hoạt động mà không thay đổi bất kỳ điều gì khác.

+0

Cảm ơn. Cái thứ hai không hiệu quả, nhưng tôi sẽ đi với cái cũ. –

+0

Trong khi tôi chưa giải quyết nó, tôi nghĩ bạn đã chỉ cho tôi đúng hướng. Tôi không chắc chắn nếu biến đổi cụ thể này đang được kích hoạt trên chính PhotoImageView, hoặc cuộn có chứa nó. –

+0

Cá nhân tôi sẽ di chuyển tất cả logic để căn giữa nội dung của scrollview cho chính lớp con scrollview. Ở đó, bạn có thể ghi đè lên -setContentOffset: để thực hiện bố cục thay vì sử dụng các phương thức ủy quyền thu phóng. – hatfinch

0

Tôi đã thử mã github của bạn trên các trình mô phỏng iOS 4.2 và 4.3 và nó hoạt động tốt ... không thay đổi kích thước hình ảnh nào! Có thể có một số vấn đề về phiên bản. Ngoài ra, tôi đã cố gắng thay đổi hình ảnh động của bạn chặn và sau phục vụ cùng một mục đích:

void (^updateProperties) (void) =^{ 
      self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f; 
      self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; } 

Hãy cho tôi biết nếu tôi thiếu cái gì đó :)

+0

Để kiểm tra những gì tôi đã trình diễn trong các video, bạn cần phải thêm nó vào một thanh điều khiển tabbar, và tôi muốn giới thiệu một loại tốt các hình ảnh từ flickr khi bạn xây dựng nó. Tôi có thể đặt cùng một mẫu nếu bạn cần. –

+0

chắc chắn ... điều đó sẽ hữu ích. – tipycalFlow

Các vấn đề liên quan