2010-10-12 22 views
5

Trên ảnh chụp màn hình sau đây, nếu tôi nhấp vào "v" từ "Kiosk có sẵn", điều này sẽ khởi chạy tác vụ của nút quay lại ... (không phải với "a" thứ hai).UINavigationItem Back Button touch area quá lớn

alt text

Tôi không hiểu tại sao, tôi đã không có gì đặc biệt trong mã của tôi (đây là backbutton mặc định xử lý bởi bộ điều khiển chuyển hướng). Tôi cũng có lỗi tương tự với một ứng dụng khác mà tôi đã làm nhưng tôi không bao giờ nhận thấy điều này trên các ứng dụng khác.

Bất kỳ ý tưởng nào?

Cảm ơn bạn.

+0

tôi có cùng một sự cố ngay bây giờ, bạn có tìm thấy giải pháp không? –

+0

nope xin lỗi ... Tôi thấy rằng lỗi trong nhiều ứng dụng ...: o –

Trả lời

8

Đó không phải là lỗi, nó cũng giống nhau trong các ứng dụng của Apple và thậm chí trên một số nút (nhiều/tất cả?). Đó là hành vi của các sự kiện cảm ứng trên các nút: diện tích của cảm ứng lớn hơn giới hạn của nút.

1

Tôi cần phải làm điều tương tự và vì vậy tôi đã kết thúc cuộc tranh luận UINavigationBar với phương thức withEvent và kiểm tra toạ độ y của liên lạc trước khi gọi phương thức gốc.
Điều này có nghĩa là khi chạm quá gần nút mà tôi đang sử dụng trong Điều hướng, tôi có thể hủy nó.

Ex: Các nút quay lại hầu như luôn chiếm được sự kiện cảm ứng thay cho nút "đầu tiên" enter image description here

Đây là loại của tôi:

@implementation UINavigationBar (UINavigationBarCategory) 
- (void)sTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
float maxY = 0; 
for (UITouch *touch in touches) { 
    float touchY = [touch locationInView:self].y; 
    if ([touch locationInView:self].y > maxY) maxY = touchY; 
} 

NSLog(@"swizzlelichious bar touchY %f", maxY); 

if (maxY < 35) 
    [self sTouchesEnded:touches withEvent:event]; 
else 
    [self touchesCancelled:touches withEvent:event]; 
} 
- (void)sTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
float maxY = 0; 
for (UITouch *touch in touches) { 
    float touchY = [touch locationInView:self].y; 
    if ([touch locationInView:self].y > maxY) maxY = touchY; 
} 

NSLog(@"swizzlelichious bar touchY %f", maxY); 

if (maxY < 35) 
    [self sTouchesBegan:touches withEvent:event]; 
else 
    [self touchesCancelled:touches withEvent:event]; 
} 

Việc thực hiện sự gian lận bởi Mike Ash từ CocoaDev

void Swizzle(Class c, SEL orig, SEL new) 
{ 
Method origMethod = class_getInstanceMethod(c, orig); 
Method newMethod = class_getInstanceMethod(c, new); 
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) 
    class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
else 
    method_exchangeImplementations(origMethod, newMethod); 
} 

Và hàm gọi hàm swizzle

Tôi không biết liệu Apple có đồng ý với điều này hay không, nó có thể vi phạm nguyên tắc UI của họ, tôi sẽ cố cập nhật bài đăng nếu sau khi tôi gửi ứng dụng đến cửa hàng ứng dụng.

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