2010-06-03 41 views
7

Vì vậy, tôi gặp sự cố với các nút và hoạt ảnh. Về cơ bản, tôi đang tạo hoạt ảnh cho chế độ xem bằng cách sử dụng hoạt ảnh UIView trong khi cũng cố gắng nghe các nút nhấn trên nút bên trong chế độ xem. Chế độ xem chỉ lớn bằng nút và chế độ xem thực sự là lớp con của UIImageView có hình ảnh bên dưới nút. Chế độ xem là chế độ xem con của chế độ xem vùng chứa được đặt trong Trình tạo giao diện với bật tương tác người dùng và bật cắt. Tất cả hoạt ảnh và xử lý nút được thực hiện trong lớp con UIImageView này, trong khi thông báo startFloating được gửi từ một lớp riêng biệt nếu cần.iPhone Hoạt ảnh UIView Tắt UIButton Subview

Nếu tôi không hoạt ảnh, thông báo buttonTapped: được gửi chính xác, nhưng trong khi hoạt ảnh, nó sẽ không được gửi. Tôi cũng đã thử triển khai phương thức touchesEnded và hành vi tương tự cũng xảy ra.

UIImageView lớp con init (Tôi đã vào nút điền với một màu để tôi có thể nhìn thấy khung được thiết lập đúng, mà nó):

- (id)initWithImage:(UIImage *)image { 
    self = [super initWithImage:image]; 
    if (self != nil) { 
     // ...stuffs 

     UIButton *tapBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
     tapBtn.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
     [tapBtn addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; 
     tapBtn.backgroundColor = [UIColor cyanColor]; 
     [self addSubview:tapBtn]; 

     self.userInteractionEnabled = YES; 
    } 
    return self; 
} 
phương pháp

Animation bắt đầu các hình ảnh động (nếu tôi không gọi nút này các tác phẩm một cách chính xác):

- (void)startFloating { 
    [UIView beginAnimations:@"floating" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:10.0f]; 
    self.frame = CGRectMake(self.frame.origin.x, -self.frame.size.height, self.frame.size.width, self.frame.size.height); 
    [UIView commitAnimations]; 
} 

Vì vậy, để được rõ ràng:

  • Sử dụng hình ảnh động UIView có hiệu quả vô hiệu hóa nút.
  • Tắt hoạt ảnh khiến nút hoạt động.
  • Nút được định kích thước chính xác và định vị trên màn hình và di chuyển cùng với chế độ xem chính xác.

Trả lời

7

Hoạt ảnh chỉ là kẹo mắt. Các hình ảnh động chậm phía sau phong trào thực tế của xem. Nút đã ở điểm đích khi hoạt ảnh bắt đầu. Bạn chỉ nhìn thấy một bộ phim của khung nhìn/di chuyển.

Nếu bạn muốn nút có thể nhấp được trong khi hoạt ảnh, bạn sẽ phải tự tạo hoạt ảnh.

+0

Hmm sau khi làm một số thử nghiệm Tôi tin rằng bạn là chính xác. Điều này có vẻ khá janky mặc dù, chống lại sự mong đợi cho hình ảnh động. Khi bạn nói "làm cho hình ảnh động của mình" bạn đang đề cập đến một hình ảnh động phong cách NSTimer? Ngoài ra tôi giả sử thực hiện gia đình phương pháp chạm sẽ thể hiện hành vi tương tự? – bensnider

+0

Vì vậy, có sử dụng một hình ảnh động NSTimer tôi có thể sử dụng nút theo cách này. Cảm ơn. – bensnider

+0

Bạn cũng có thể tự theo dõi cảm ứng và không dựa vào nút nào cả. Nó vẫn sẽ yêu cầu một số hoạt ảnh thủ công, nhưng có thể cung cấp cho bạn kết quả tốt hơn cho tương tác. – axiixc

5

... đã gặp sự cố tương tự này vì mã của tôi đang thực hiện một hoạt ảnh lớn trên mỗi khối. Tôi đã thực hiện một giải pháp dựa trên NSTimer, giống như giải pháp được đề xuất ở trên, và nó đã hoạt động ... nhưng chuyển động đã giật (trừ khi tôi chèn hoạt ảnh vào trong mỗi lần kích hoạt sự kiện hẹn giờ).

Vì vậy, vì hoạt ảnh là bắt buộc, nên tôi đã tìm thấy giải pháp không yêu cầu hẹn giờ. Nó chỉ hoạt hình một khoảng cách ngắn và do đó nút bấm vẫn chính xác, chỉ với một lỗi nhỏ là trường hợp của tôi là rất không đáng kể trong giao diện người dùng, và có thể được giảm tùy thuộc vào params của bạn.

Lưu ý rằng lỗi tại bất kỳ thời điểm đã cho nào là < 15.0, có thể được giảm để có độ chính xác cao hơn tùy thuộc vào yêu cầu tốc độ hoạt ảnh của bạn. Bạn cũng có thể giảm thời gian cho tốc độ nhanh hơn.

- (void)conveyComplete:(UIView*)v 
{ 
    [self convey:v delay:0]; 
} 

- (void)convey:(UIView*)v delay:(int)nDelay 
{ 
    [UIView animateWithDuration:.5 
          delay:nDelay 
         options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
        animations:^
        { 
         CGRect rPos = v.frame; 
         rPos.origin.x -= 15.0; 
         v.frame = rPos; 
        } 
        completion: ^(BOOL finished) 
        { 
         [self conveyComplete:v]; 
        }]; 

} 
20

này giải quyết vấn đề này:

[UIView animateWithDuration:20 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction 
    ... 
+1

'UIViewAnimationOptionAllowUserInteraction' là những gì tôi cần. Cảm ơn! – buildsucceeded

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