2010-03-29 23 views
14

Tôi đang cố gắng xác định xem một nhãn UILabel có được chạm vào không và nếu có thì hãy làm gì đó. Tặng ..Tôi làm cách nào để xác định xem có chạm vào nhãn UIL không?

. 
. 
. 
UILabel * site = [[UILabel alloc] initWithFrame:CGRectMake(0, 185, 320, 30)]; 
site.text = [retriever.plistDict valueForKey:@"url"]; 
site.textAlignment =UITextAlignmentCenter; 
site.backgroundColor = [UIColor clearColor]; 
site.textColor = [UIColor whiteColor]; 
site.userInteractionEnabled = YES; 
[theBgView addSubview:site]; 
[site release]; 
. 
. 
.  

Sau đó, tôi viết lại cuộc gọi.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    retriever = [PListRetriever sharedInstance]; 
    CGPoint pt = [[touches anyObject] locationInView: self]; 
     NSURL *target = [[NSURL alloc] initWithString:[retriever.plistDict valueForKey:@"url"]]; 
     [[UIApplication sharedApplication] openURL:target]; 
    } 

Vấn đề là ngay bây giờ, bất kể tôi chạm vào Url chế độ xem đang được mở. Làm cách nào để xác định xem chỉ có nhãn của tôi đã được chạm vào?

+6

Tại sao bạn không thay thế nhãn bằng một nút? – zonble

Trả lời

20

Nếu bạn thêm nhãn vào lớp, bạn có thể làm một hit-test trên quan điểm của bạn trong trường hợp liên lạc với:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])) 
    { 
    NSURL *target = [[NSURL alloc] ...]; 
    ... 
    } 
} 

Ngoài ra, đừng quên để phát hành các URL mà bạn đã phân bổ (nếu không bạn đang bị rò rỉ).

+0

Đúng, những gì anh ta nói. Câu trả lời tuyệt vời Kevin! – Jordan

+0

Điều này được phục vụ cho tôi với cử chỉ –

1

Bạn cũng có thể thêm hình ảnh ẩn (không phải văn bản hoặc hình ảnh) UIButton dưới dạng một chế độ xem con có cùng kích thước với nhãn của bạn. Điều này có lợi ích bổ sung khi không chụp các loại chạm khác, chẳng hạn như chạm vào một khu vực khác của màn hình vô tình trượt lên nhãn của bạn và sau đó nhấc lên. Nó cũng có thể được coi là mã sạch hơn.

4

tôi nghĩ rằng cách tốt nhất để xử lý là để thiết lập cờ cho từng phần UILabel và sau đó cung cấp số lượng cờ từ mã,

label.userInteractionEnabled = YES; 


-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [touches anyobject]; 

    if(touch.view.tag == uurflagnumber) 
    NSlog(@"touched"); 
} 
19

Bạn có thể làm điều này mà không trọng touchesBegan. Sử dụng công cụ nhận dạng cử chỉ.

UILabel *label = ...; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *recognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)] autorelease]; 

[label addGestureRecognizer:recognizer]; 

- (void)tapAction { 
    NSLog(@"tap performed"); 
} 
+0

xin lỗi, đã không hoạt động đối với tôi ...(không có gì kích hoạt) – cV2

+0

Điều này có thể do nhiều tùy chọn khác nhau gây ra. Ví dụ: chạm của bạn có thể bị hủy khỏi một lớp che khuất nhãn bạn đang đặt trình nhận dạng cử chỉ lên hoặc thuộc tính userInteractionEnabled của chế độ xem của bạn có thể được đặt thành NO tại một số thời điểm khi bạn thực hiện tác vụ nhấn. Thêm nhãn làm đối tượng cuối cùng của mảng xem phụ của chế độ xem mục tiêu của bạn và thử lại. – Eugene

+0

cảm ơn rất nhiều câu trả lời của bạn, userInteractionEnabled đã được đặt thành bật, tôi đã giải quyết một chút cho phép người dùng thực hiện tất cả các hành động cần thiết. cảm ơn bạn! – cV2

4

Giải pháp của Eugene hoạt động nhưng bạn phải có "tương tác người dùng được kích hoạt" được đánh dấu trong tệp NIB của bạn. Hoặc như Mahyar có với label.userInteractionEnabled = YES.

Đây là giải pháp của tôi vì tôi có hai nhãn riêng biệt mà tôi muốn chụp chạm. Và tôi đã "kích hoạt tương tác người dùng" được chọn trong tệp nib của tôi.

UITapGestureRecognizer *theSpeedTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[speedLabel addGestureRecognizer:theSpeedTapped]; 

UITapGestureRecognizer *theDirectionTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[directionLabel addGestureRecognizer:theDirectionTapped]; 

Tôi hy vọng điều này sẽ hữu ích.

0

Một câu trả lời muộn ...

Giống như @Kevin Sylvestre gợi ý, bạn có thể kiểm tra các liên lạc trên một UILabel bằng cách ghi đè -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event trong điều khiển điểm của bạn.

Tuy nhiên, thay vì kiểm tra nếu chạm được đặt với rect của UILabel, tôi thấy dễ dàng hơn để kiểm tra nếu chạm vào 'xem' của UILabel (nhớ UILabel kế thừa từ UIView).

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    NSSet *touchedViews = [touches valueForKeyPath:@"view"]; 
    if ([touchedViews containsObject:self.myLabel]) { 
     // do something 
    } 
} 

Kỹ thuật này có thể dễ dàng áp dụng cho các đối tượng giao diện khác được kế thừa từ UIView.

Ngoài ra, UILabel cũng cần phải có 'tương tác người dùng được bật' để phản ứng với sự kiện chạm. Điều này có thể được thực hiện trong Trình tạo giao diện (Thuộc tính thanh tra> Chế độ xem> Tương tác người dùng được bật) hoặc theo chương trình - ví dụ: self.myLabel.userInteractionEnabled = YES;

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