iOS:在NSAttributedString上添加按钮

我想知道是否可以将UIButton放在一段文本的精确坐标上。

例如,我的UILabel有这样的文字:

“没有账号? 登录

在斜体内容中,我需要在此处按下按钮,触摸此按钮将触发将打开登录视图的操作

非常重要的是要使这个function很好,在其他语言中使用相同而不做任何事情:)

谢谢

我会回答我的回答,因为这对于遇到同样问题的其他开发人员有帮助。

1 :您需要实现UITextViewDelegate方法: - (BOOL)textView:shouldInteractWithURL:inRange:

实现非常简单,基本上,您将比较NSURL中收到的链接。 当我有许多链接时,我喜欢使用NSURL组件通过主机进行比较,例如:

 - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { NSString *urlScheme = URL.scheme; NSString *host = URL.host; if([urlScheme isEqualToString:@"myapp"]) { if([host isEqualToString:@"/signin"]) [self.onSignRequest( self )]; } return YES; } 

当用户触摸链接时,将调用此方法。

2 :创建两个NSString实例,一个用于字符串"Don't have an account?" 另一个字符串"Sign Up"

 NSString *labelText = @"Don't have an account? "; NSString *linkedText = @"Sign Up"; 

3 :创建一个NSMutableAttributedString实例,并且两个字符串都已连接:

 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:[AttributedText attributedStringWithText:[NSString stringWithFormat:@"%@%@", labelText, linkedText] font:[UIFOnt systemFontOfSize:14.f] color:[UIColor blueColor]]]; 

4 :为之前创建的可变属性字符串创建链接文本的范围:

 NSRange range = [[attributedString string] rangeOfString:linkedText]; 

5 :创建一个字符串

5 :为可变字符串添加新的NSLinkAttributeName ,其中包含在步骤4中创建的范围

 [attributedString addAttribute:NSLinkAttributeName value:URLStringLink range:range]; 

6 :使用UILabel的attributedText属性将可变字符串添加到UILabel

 _label.attributedText = attributedText; 

7 :设置标签的代表:

 _label.delegate = textViewDelegate; 

就是这样。 我希望这对任何人都需要在UILabel添加“可触摸”链接有所帮助

干杯,

最简单的方法是将它们分成两个不同的标签,并将按钮框设置为第二个标签的框架。 更难的方法是创建字符串大小并手动创建按钮的CGRect。 那种方法是这样的:

 CGSize dontSize = [@"Dont have an account?" sizeWithFont:label.font]; CGSize signinSize = [@"Sign In" sizeWithFont:label.font]; //Originate to the whole label's frame CGRect buttonFrame = label.frame; buttonFrame.origin.x += dontSize.width; buttonFrame.size.width = signinSize.width; 

我已经实现了类似的东西。 您只需在Interface Builder中将Tap Gesture Recognizer添加到View Controller并将其与标签链接即可。

Tap Gesture Recognizer具有一个IBAction方法,您可以将代码放入其中。点击手势识别器的区域将自动匹配标签。

您还可以在标签上使用“归因文本”使其显示为链接(带颜色和下划线)。

如果您只想从斜体文本中触发操作,则应在NSLinkAttributeName另外添加NSFontAttributeName 。 选择你想要的任何链接,比如myapp://action1

然后使用UITextView而不是UILabel并将您的类指定为委托和实现

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange

做你想做的任何动作并返回NO,这将阻止Safari开始。

覆盖部分UILabel

  • 分成2个UILabel,然后设置框架以匹配登录标签:
 [button setFrame:signinLabel.frame]; [button setCenter:signinLabel.center]; 

要么

  • 猜测坐标,直到您正确设置UIButton的(硬编码)

要么

  • 从UILabel中删除“登录”并将其作为UIButton的标题