Я использовал "Регистрировать себя" как текст. Я хочу сделать это как ссылку. И нажав на эту ссылку, он должен открыть Register.xib
.
Как я могу получить эту ссылку?
Я использовал "Регистрировать себя" как текст. Я хочу сделать это как ссылку. И нажав на эту ссылку, он должен открыть Register.xib
.
Как я могу получить эту ссылку?
Карим прав. Создайте объект UIButton, установите для него тип "Пользовательский", а затем вы можете присвоить ему название. Подключите действие к методу, который подталкивает или представляет ваш контроллер представления реестра, и все будет установлено.
Вероятно, вы захотите указать пользователю, что текст является ссылкой на клики. Либо установите цвет текста на синий. Другой, полностью отдельный вариант - использовать NSAttributedString
(который имеет атрибут подчеркивания), чтобы указать пользователю, что текст доступен для клика. Для этого требуется замена Open Source для UITextView (о чем вы можете узнать из этого связанного вопроса).
Я думаю, что ниже вы получите то, что хотите...
- (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 ;
}
}
}
Там есть место, которое стоит упомянуть. Использование UIButton
с UIButtonTypeCustom
имеет некоторые недостатки, а именно, что у вас ограниченный контроль над стилем текста (например, вы не можете сделать его правым или левым выровненным, он всегда будет центрирован).
Использование NSAttributedString
может быть чрезмерным и сложным для реализации, если вы не знакомы с NSAttributedString
, CoreText и т.д.
Решение, которое я использовал, представляет собой простой подкласс UIControl
, который позволяет настраивать больше, чем подклассификация UIButton
и меньше хлопот, чем NSAttributedString
et al. Подход UIControl
подходит только в том случае, если вся строка будет "ссылкой".
Вы бы сделали что-то подобное в своем подклассе UIControl
:
UILabel
в методе initUILabel
с помощью ваших желаемых backgroundColor
, textColor
, textAlignment
и т.д., включая изменения слоя UILabel
, если вы хотите, чтобы фон отображался как Twitter в tweet-ссылках в приложении iOSsetHighlighted:
, чтобы настроить изменения внешнего вида прикосновения/отслеживания@property
сеттеры в файл .h
, чтобы класс владельца мог установить состояниеСначала создайте присланную строку и сохраните диапазон интерактивного текста и самого текста.
Затем нарисуйте присланную строку с помощью CoreText Framework, сохраните 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);
Последнее, переопределить [view touchesEnded: (NSSet *) касается событияEvent: (UIEvent *)] следующим образом:
- (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;
}
Вы получаете интерактивный текст в touchesEnded, тогда вы можете делать все, что хотите, например, запускать метод делегата.
PS: это старое решение, я слышал, что iOS5 предоставил что-то вроде усовершенствованного UIWebView для реализации требований, возможно, вы могли бы проверить библиотеку документов sdk Apple.
Возьмите кнопку и установите заголовок кнопки, которую вы хотите установить как текст гиперссылки. Вы можете выбрать кнопку по умолчанию и пользовательскую кнопку кнопки в iOS 7 и iOS 8, но для ниже iOS 7 вы должны использовать только тип кнопки. Вы можете изменить цвет текста, чтобы выделить текст для пользовательского интерфейса, а затем добавить любое действие, которое вы хотите добавить при нажатии этой кнопки. Это будет работать как шарм, удача.
Взгляните на TTTAttributedLabel. Очень просто настроить ссылки, телефоны и т.д.