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的标题
- 如何在swift中点击一个tableview单元格中点击button标题3
- 现在,testflight库和Xcode 5中没有任何更改说:“找不到-lTestFlight的ld:库”
- 设置AVAudioTimePitchAlgorithmVarispeed为AVFoundationAudioSettings
- App Store提交/分发错误“未能打开ssh会话”
- URLSession dataTask completionHandler在游乐场中不起作用
- Jazzy不能按照预期生成快速文档
- SpriteKit iPhone / iPad不同的分辨率,需要相同的物理
- 算术运算符和键值编码
- validation/提交错误:应用程序代码validation失败