2012-01-04 34 views
10

Tôi đã sử dụng "Đăng ký chính mình" dưới dạng văn bản. Tôi muốn biến nó thành liên kết. Và bằng cách nhấp vào liên kết đó, nó sẽ mở ra Register.xib.Để đặt văn bản nhãn làm liên kết

Làm cách nào để nhận liên kết này ??

+0

không thể hiểu ý nghĩa của bạn. Bạn có nghĩa là làm thế nào để thực hiện một siêu liên kết trên văn bản, sau đó khi nhấp vào, đi đến Đăng ký xem? – Raptor

+5

Tốt hơn là sử dụng UIbutton của loại tùy chỉnh thay vì lablel. –

+0

Nghe như thế này. http://stackoverflow.com/questions/4743457/how-to-customize-uilabel-clickable – Ilanchezhian

Trả lời

12

Kareem là đúng. Tạo một đối tượng UIButton, thiết lập nó là "Custom" và sau đó bạn có thể đặt cho nó một tiêu đề. Kết nối hành động với một phương thức đẩy hoặc trình bày bộ điều khiển xem Đăng ký của bạn và bạn sẽ được thiết lập tất cả.

Có thể bạn sẽ muốn đưa ra một số dấu hiệu cho người dùng rằng văn bản là liên kết có thể nhấp. Đặt màu của văn bản thành màu xanh lam. Một tùy chọn khác hoàn toàn tách biệt là sử dụng NSAttributedString (có thuộc tính gạch dưới) để chỉ ra cho người dùng biết rằng văn bản có thể nhấp được. Điều đó yêu cầu an Open Source replacement for UITextView (bạn có thể tìm hiểu thêm về từ this related question).

+0

Xin chào tất cả, Kareem, Michael, cảm ơn rất nhiều .... nhưng tôi có một truy vấn khác mà tôi không thể tìm thấy bất kỳ phương pháp nào cho người dùng biết rằng văn bản có thể nhấp được, tức là có màu xanh dương của văn bản. Một điều nữa, tôi có thể có biểu tượng "tay" khi người dùng di chuyển con trỏ qua chuỗi đó .. ??? – Krunal

+0

Tôi nghĩ rằng u đang yêu cầu ứng dụng iphone và ứng dụng iphone sẽ không hiển thị bất kỳ con trỏ trên màn hình, phải không? – DivineDesert

+0

Rất tiếc ... vâng, tôi hiểu rồi ... – Krunal

0

Trước tiên, hãy tạo chuỗi được phân bổ và lưu phạm vi của văn bản tương tác và văn bản.

Sau đó, vẽ chuỗi được phân bổ bằng Khung lõi, giữ CTFrameRef.

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString); 
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddRect(path, NULL, bounds); 

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); 
CFRelease(framesetter); 

CTFrameDraw(frame, context); 
//CFRelease(frame); 

CGPathRelease(path); 

cuối cùng, ghi đè lên [xem touchesEnded: (NSSet *) chạm withEvent: (UIEvent *) sự kiện] như thế này:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSSet *allTouches = [event allTouches]; 
    if ([allTouches count] == 1) { 
     UITouch *touch = (UITouch *)[allTouches anyObject]; 
     CGPoint touchPoint = [touch locationInView:self]; 

     // Convert to coordinate system of current view 
     touchPoint.y -= self.bounds.size.height; 
     touchPoint.y *= -1; 

     CGPathRef statusPath = CTFrameGetPath(statusCTFrame); 
     NSString *touchedInterStr = nil; 
     if (CGPathContainsPoint(statusPath, NULL, touchPoint, FALSE)) { 
      touchedInterStr = [self getInteractiveStringInFrame:statusCTFrame atPosition:touchPoint]; 
     } else { 
      return ; 
     } 
    } 
} 

- (NSString *)getInteractiveStringInFrame:(CTFrameRef)frame atPosition:(CGPoint)point 
{ 
    CGPathRef path = CTFrameGetPath(frame); 
    CGRect rect; 
    CGPathIsRect(path, &rect); 

    // Convert point into rect of current frame, to accurately perform hit testing on CTLine 
    CGPoint pointInsideRect = point; 
    pointInsideRect.x = point.x - rect.origin.x; 

    CFArrayRef lines = CTFrameGetLines(statusCTFrame); 
    CFIndex count = CFArrayGetCount(lines); 
    CGFloat curUpBound = rect.origin.y + rect.size.height; 
    CFIndex touchedIndex = -1; 
    for (CFIndex pos = 0; pos < count; pos++) { 
     CTLineRef curLine = CFArrayGetValueAtIndex(lines, pos); 
     CGFloat ascent, descent, leading; 
     CTLineGetTypographicBounds(curLine, &ascent, &descent, &leading); 
     CGFloat curHeight = ascent + descent + leading; 
     if (pointInsideRect.y >= curUpBound-curHeight && pointInsideRect.y <= curUpBound){ 
      touchedIndex = CTLineGetStringIndexForPosition(curLine, pointInsideRect); // Hit testing 
      break; 
     } 
     curUpBound -= curHeight; 
    } 
    if (touchedIndex == -1) 
     return nil; 

    NSEnumerator *enumerator = [interactiveStrs objectEnumerator]; 
    InteractiveString *curString; 
    while ((curString = (InteractiveString *)[enumerator nextObject])) { 
     if (NSLocationInRange(touchedIndex, curString.range)) { 
      return curString.content; 
     } 
    } 

    return nil; 
} 

Bạn nhận được các văn bản tương tác trong touchesEnded, sau đó bạn có thể làm bất cứ điều gì bạn muốn, như kích hoạt một phương thức đại biểu.

PS: đây là giải pháp thời trang cũ, tôi nghe nói rằng iOS5 đã cung cấp một cái gì đó giống như một UIWebView nâng cao để thực hiện các yêu cầu, có thể bạn có thể kiểm tra thư viện tài liệu sdk táo.

+0

"InteractiveString" Tôi không tìm thấy nó là gì .... –

2

Tôi nghĩ rằng bởi bên dưới, bạn sẽ nhận được những gì bạn muốn ...

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSSet *allTouches = [event allTouches]; 
    if ([allTouches count] == 1) 
    { 
     UITouch *touch = (UITouch *)[allTouches anyObject]; 
     CGPoint touchPoint = [touch locationInView:self]; 

     // Convert to coordinate system of current view 
     touchPoint.y -= self.bounds.size.height; 
     touchPoint.y *= -1; 

     CGPathRef statusPath = CTFrameGetPath(statusCTFrame); 
     NSString *touchedInterStr = nil; 
     if (CGPathContainsPoint(statusPath, NULL, touchPoint, FALSE)) 
     { 
      touchedInterStr = [self getInteractiveStringInFrame:statusCTFrameatPosition:touchPoint]; 
     } 
     else 
     { 
      return ; 
     } 
    } 
} 
2

Có một trung đất đó là đáng nói. Sử dụng UIButton với UIButtonTypeCustom có một số thiếu sót, cụ thể là bạn có quyền kiểm soát giới hạn đối với kiểu dáng văn bản (ví dụ: bạn không thể căn chỉnh sang phải hoặc căn trái, nó sẽ luôn được căn giữa).

Sử dụng NSAttributedString có thể quá mức cần thiết, và khó khăn để thực hiện nếu bạn không quen với NSAttributedString, CoreText, vv

Một giải pháp tôi đã sử dụng là một lớp con đơn giản của UIControl cho phép tùy biến hơn subclassing UIButton và ít rắc rối hơn NSAttributedString et al. Cách tiếp cận UIControl chỉ thích hợp nếu toàn bộ chuỗi sẽ là "liên kết".

Bạn sẽ làm một cái gì đó như thế này trong UIControl phân lớp của bạn:

  • Thêm một subview UILabel trong phương thức init
  • Cấu hình UILabel với mong muốn của bạn backgroundColor, textColor, textAlignment vv, trong đó có thay đổi đối với UILabel lớp nếu bạn muốn nền xuất hiện giống như liên kết trong Twitter của Twitter trong Ứng dụng iOS
  • Ghi đè phương thức setHighlighted: để tùy chỉnh giao diện d cảm thấy thay đổi nào trên touch/theo dõi
  • Thêm @property setters trong file .h vì vậy lớp sở hữu có thể thiết lập trạng thái
0

Hãy nút và thiết lập tiêu đề của nút mà bạn muốn thiết lập bản như siêu liên kết. Bạn có thể chọn nút loại nút mặc định và tùy chỉnh trong iOS 7 và iOS 8, nhưng đối với iOS 7 bạn chỉ phải thực hiện tùy chỉnh loại nút. Bạn có thể thay đổi màu của văn bản để đánh dấu văn bản cho giao diện người dùng và hơn là thêm bất kỳ hành động nào bạn muốn thêm vào nút đó. Nó sẽ hoạt động như sự quyến rũ, may mắn.

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