2013-09-30 13 views
8

Tôi có một vài UIButtons ở cuối màn hình chính của ứng dụng. Các nút này không liên tục làm nổi bật khi người dùng chạm vào chúng nhưng phương pháp đích của chúng luôn được gọi. Tôi đã phát hiện ra nó là bộ nhận dạng cử chỉ của Trung tâm điều khiển nhận được trong cách làm nổi bật của UIButton. Nếu tôi di chuyển chế độ xem có chứa lên ở giữa màn hình, mọi chức năng được thiết kế.UIButton ở dưới cùng của màn hình chỉ làm nổi bật liên tục

Vấn đề được báo cáo ở đây https://devforums.apple.com/message/865922

Là một workaround Tôi đã cố gắng thiết lập trạng thái được đánh dấu bằng tay với các phương pháp mục tiêu. Điều này dường như có tác dụng tương tự cho phép UIButton làm nổi bật bình thường.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này mà không cần thiết kế lại các điều khiển này để xuất hiện ở nơi khác trong ứng dụng?

Có lẽ tôi sử dụng chế độ xem chuẩn và thêm tất cả các phương pháp cho tương tác chạm bằng tay? Tôi sẽ làm như thế nào? Nó có đáng để khám phá không?

+0

Các nút đôi khi không làm nổi bật khi người dùng chạm vào chúng? Và ý bạn là gì bởi trình nhận dạng cử chỉ của "Trung tâm điều khiển". Bạn có nghĩa là các công cụ nhận dạng cử chỉ tích hợp của nút không? – bilobatum

+0

Tôi đã chỉnh sửa câu hỏi của mình. Khi người dùng chạm vào một nút ở cuối màn hình, nó chỉ liên tục được đánh dấu. Điều này là do cử chỉ vuốt dành riêng để đưa lên Trung tâm điều khiển chặn đánh dấu. –

+0

bạn đã thử đặt UIControlStateSelected bằng button.selected = YES chưa? –

Trả lời

4

Tôi đã tìm thấy một giải pháp khá đơn giản cho việc này. Sử dụng các thuộc tính tiêu chuẩn như .highlighted = YES và .selected = YES dường như không hoạt động trong dải dưới cùng đó. Thay vì thiết lập trạng thái được đánh dấu, tôi chỉ cần đặt hình nền của nút thành trạng thái được đánh dấu với độ trễ không được nhận trước TRƯỚC KHI chúng ta gọi phương thức cuối cùng.

[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; 
[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateHighlighted]; 
[self.stopRecordingButton addTarget:self action:@selector(stopRecordingDelay) forControlEvents:UIControlEventTouchUpInside]; 

-(void)stopRecordingDelay 
{ 
    [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateNormal]; 

    [self performSelector:@selector(stopRecording) withObject:nil afterDelay:0.025f]; 
} 

- (void)stopRecording 
{ 
    [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; 

    //Do real stuff 
} 
3

Gần đây tôi đã gặp sự cố tương tự và tìm kiếm ở mọi nơi để có câu trả lời. Đây là những gì làm việc cho tôi. Đó là sự kết hợp của hai thứ, UINavigationController cử chỉ vuốt trở lại và cử chỉ trung tâm điều khiển iOS 7 (vuốt lên từ dưới cùng của màn hình).

Vô hiệu hóa các cử chỉ swipe trở lại nếu trên UINavigationController:

trong viewDidLoad:

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 
    self.navigationController.interactivePopGestureRecognizer.enabled = NO; 
} 

Đặt trung tâm điều khiển cử chỉ để chỉ hiển thị một mũi tên lên thay vì hiển thị trung tâm điều khiển đầu tiên. Bạn có thể thực hiện việc này bằng cách ghi đè phương thức UIViewController sau:

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

Hy vọng điều này sẽ hữu ích!

+1

Đây là giải pháp kỹ thuật, vâng, nhưng nó đòi hỏi phải thay đổi trải nghiệm người dùng cơ bản bằng cách ẩn thanh trạng thái VÀ tắt thao tác ngược lại. Ứng dụng của tôi sẽ không phải là nơi thích hợp để ẩn thanh trạng thái hoặc tắt cử chỉ ngược lại. –

1

Tôi đã đăng bản sửa lỗi cho sự cố này mang lại điểm nổi bật được mô tả trong số question này. Điểm nổi bật được cố định bởi subclassing UIButton và override pointInside: để bắt các sự kiện chạm

+0

Giải pháp được đề cập ở trên "cài đặt hình ảnh trạng thái được đánh dấu" có vẻ tốt. Nhưng, giải pháp được cung cấp trong chuỗi được đề cập trong nhận xét này có vẻ hoàn hảo. – satish

0

Nếu bạn có một nút bao phủ toàn bộ màn hình, bạn có thể gặp phải vấn đề chỉ có phần bên trái có độ trễ này.

Để bình thường hóa thời gian phản hồi cho một nút toàn có thể sử dụng các giải pháp sau đây
(một phiên bản cải tiến của Aaron Shekey của):

NSDate *touchDownTime; 

- (void)touchDown 
{ 
    self.alpha = 0.7; 
    touchDownTime = [NSDate date]; 
} 

- (void)touchUpInside 
{ 
    // basically at least 80ms feedback is guaranteed this way 
    // note: timeIntervalSinceNow returns negative 
    NSTimeInterval feedbackTimeLeftToShow = 
     MAX(0.08 + [touchDownTime timeIntervalSinceNow], 0.001); 
    [self performSelector:@selector(touchUpInsideAfterFeedback) 
      withObject:nil 
      afterDelay:feedbackTimeLeftToShow]; 
} 

- (void)touchUpInsideAfterFeedback 
{ 
    self.alpha = 1; 
} 

lưu ý: performSelector có thể làm tốt với các giá trị chậm trễ tiêu cực, nhưng tốt hơn là an toàn hơn xin lỗi

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