5

Tôi đang cố gắng tạo một trò chơi Simon đơn giản (một chuỗi màu sắc tăng dần và người dùng phải cố lặp lại chuỗi đó). Cách tôi đang đi về nó là bằng cách có 4 UIViews với 8 hình ảnh. Vì vậy, có UIView cho màu đỏ, xanh dương, xanh lục và vàng. Và tôi có gif màu xanh lá cây đậm, xanh lá cây nhạt, đỏ đậm, đỏ nhạt, v.v.objective-c: thực thi nhiều khối chuyển đổiWithView animation

Vì vậy, trong mã của tôi, tôi đang sử dụng chuyển đổi của UIViewKhoảng hoạt họaView: Hình ảnh UIViewViewView được mặc định thành hình ảnh màu tối và khối này đang chuyển sang hình ảnh có màu sáng và khi hoàn thành quay trở lại hình ảnh màu tối (để cho nó có giao diện "sáng lên").

- (void) animateColor:(NSString *)color 
{ 
    ... 
    //do stuff to default the dark and light image name and which UIView to animate based on the color parameter 
    ... 
    [UIView transitionWithView:imageView 
        duration:.5 
        options: UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAutoreverse 
       animations:^{ 
        imageView.image = [UIImage imageNamed:lightImage]; 
       } 
       completion:^(BOOL finished){ 
        if (finished){ 
         imageView.image = [UIImage imageNamed:darkImage]; 
        } 
       }]; 
} 

Điều này làm việc tốt khi tôi gọi nó là phương pháp mã này bằng một màu.

Vấn đề là, nói rằng tôi có một NSArray hoặc màu sắc tôi muốn tạo hiệu ứng tuần tự. Vì vậy, nếu mảng của tôi là "màu xanh", "màu xanh lá cây" tôi sẽ muốn transitionWithView được gọi là sử dụng màu xanh dương, animate chế độ xem màu xanh, sau đó tạo hiệu ứng cho chế độ xem màu xanh lá cây. Ngay bây giờ, nó sẽ tạo hiệu ứng cho chế độ xem màu xanh lục và chế độ xem màu xanh lam cùng một lúc.

Tôi đang cố gắng chơi với NSTimer ngay bây giờ, nhưng không có nhiều may mắn với điều đó.

Bất kỳ lời khuyên nào sẽ được đánh giá cao.

Trả lời

3

OK, vì vậy sau khi chơi xung quanh một số/rất nhiều, tôi đã tìm thấy giải pháp. Trước tiên, tôi đã thay đổi transitionWithView trông như thế này:

[UIView transitionWithView:imageView 
        duration:1 
        options: UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        imageView.image = [UIImage imageNamed:lightImage]; 
       } 
       completion:^(BOOL finished){ 
        if (finished){ 
         [UIView transitionWithView:imageView 
              duration:1 
              options:UIViewAnimationOptionTransitionCrossDissolve 
             animations:^{ 
              imageView.image = [UIImage imageNamed:darkImage]; 
             } 
             completion:^(BOOL done){ 
              if (done){ 
               // Do some program upkeep logic 
              } 
             } 
         ]; 
        } 
       } 
]; 

Sự thay đổi lớn trên được tháo UIViewAnimationOptionAutoreverse gốc tôi đã có, và thêm các hình ảnh động để đi từ hình ảnh ánh sáng để hình ảnh đậm trong khối hoàn thành.

Sau đó, để gọi các phương pháp trên (animateColor :), tôi lặp qua một mảng và sử dụng một thực hiện chọn với một afterDelay tăng:

for (NSString *color in self.randomPattern.patternArray) { 
     [self performSelector:@selector(animateColor:) withObject:color afterDelay:1.5*self.counter]; 
     ++self.counter; 
    } 
5

Tôi đã có một vấn đề tương tự khi tôi cố gắng thực hiện nhiều hiệu ứng chuyển tiếp liên tục . Tôi đã giải quyết nó bằng cách chỉ cần thiết lập một biến trạng thái trong khối hoàn thành. Sau đó biến trạng thái này cho phép điều kiện cho quá trình chuyển đổi tiếp theo. Vâng, kể từ khi tôi đang sử dụng một bộ đếm thời gian với một phương pháp runloop công việc của tôi là dễ dàng hơn ở đây:

- (void) runloop { 

    static int step = 1; 

    if (step == 1) 
    { 
     step = 0; 
     [UIView transitionWithView:imageView 
          duration:1 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ imageView.image = [UIImage imageNamed:lightImage]; } 
         completion:^(BOOL finished){ step = 2; }]; 
    } 

    if (step == 2) 
    { 
     step = 0; 
     [UIView transitionWithView:imageView 
          duration:1 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ imageView.image = [UIImage imageNamed:darkImage]; } 
         completion:^(BOOL finished){ step = 0; }]; 
    } 
} 

Bằng cách này bạn có thể làm cho hàng chục hiệu ứng chuyển tiếp mà không bị mất vào khối lồng nhau.