2012-01-05 35 views
12

Tôi có một UIView với một số phụ đề và một cử chỉ Nhấn được công nhận liên quan và tôi muốn bắt chước nó có hiệu ứng 'chạm'. Tức là, khi chạm vào xảy ra, tôi muốn hiển thị chế độ xem vùng chứa để có màu nền khác nhau và văn bản của bất kỳ chế độ xem con UILabels nào cũng được đánh dấu.Làm nổi bật một UIView tương tự như UIButton

Khi tôi nhận được sự kiện tap từ UITapGestureRecognizer, tôi có thể thay đổi màu nền tốt và thậm chí thiết lập UILabel để [label setHighlighted:YES];

Vì những lý do khác nhau, tôi không thể thay đổi UIView để UIControl.

Nhưng nếu tôi thêm một số UIViewAnimation để hoàn nguyên đánh dấu, không có gì xảy ra. Bất kỳ đề xuất?

- (void)handleTapGesture:(UITapGestureRecognizer *)tapGesture { 
     [label setHighlighted:YES]; // change the label highlight property 

[UIView animateWithDuration:0.20 
          delay:0.0 
         options:UIViewAnimationOptionCurveEaseIn 
        animations:^{ 
         [containerView setBackgroundColor:originalBgColor];   
         [label setHighlighted:NO]; // Problem: don't see the highlight reverted 
        } completion:^(BOOL finished) {       
         // nothing to handle here 
        }];  
} 
+0

Tại sao không chỉ làm cho nó một 'UIButton'? –

+0

Bởi vì nó không phải là một codebase tôi sở hữu và có phụ thuộc khác vì vậy tôi phải rời khỏi nó như là UIView. –

+0

Hãy xem thư viện này: https://github.com/mta452/UIView-TouchHighlighting –

Trả lời

6

setĐánh sáng không phải là thuộc tính chế độ xem có thể hoạt hình. Thêm vào đó, bạn đang nói hai điều ngược lại: bạn setHighlighted để YES và NO trong cùng một hơi thở. Kết quả sẽ là không có gì xảy ra bởi vì không có thay đổi tổng thể.

Sử dụng trình xử lý hoàn thành hoặc hiệu suất bị trì hoãn để thay đổi đánh dấu sau.

EDIT:

Bạn nói "đã thử cả nhưng không hoạt động". Có lẽ bạn cần làm rõ về những gì tôi có nghĩa là bằng cách thực hiện chậm trễ. Tôi chỉ cố gắng này và nó hoạt động hoàn hảo:

- (void) tapped: (UIGestureRecognizer*) g { 
    label.highlighted = YES; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.2 * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     label.highlighted = NO; 
    }); 
} 

Nhãn phải có một textColor khác nhau vs nó highlightedTextColor để một cái gì đó có thể nhìn thấy xảy ra.

+0

Đã thử cả hai nhưng không hoạt động .. Tôi có thể phải tìm ra một cách sáng tạo khác để thực hiện việc này hoặc đi về việc thay thế mã nguồn hiện tại thành sử dụng UIControl. –

0

Giải pháp đơn giản là ghi đè tap cử chỉ regognizer như dưới đây:

4.x Swift

class TapGestureRecognizer: UITapGestureRecognizer { 
    var highlightOnTouch = true 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { 
     super.touchesBegan(touches, with: event) 

     if highlightOnTouch { 
      let bgcolor = view?.backgroundColor 
      UIView.animate(withDuration: 0.1, delay: 0, options: [.allowUserInteraction, .curveLinear], animations: { 
       self.view?.backgroundColor = .lightGray 
      }) { (_) in 
       UIView.animate(withDuration: 0.1, delay: 0, options: [.allowUserInteraction, .curveLinear], animations: { 
        self.view?.backgroundColor = bgcolor 
       }) 
      } 
     } 
    } 

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