iOS:在NSAttributedString上添加按钮

时间:2013-06-24 14:38:18

标签: ios uibutton nsattributedstring

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

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

“没有帐户?登录

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

非常重要的是要使这个功能很好,在没有做任何事情的情况下使用其他语言:)

由于

5 个答案:

答案 0 :(得分:5)

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

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 :使用attributedText的{​​{1}}属性

将可变字符串添加到UILabel
UILabel

7 :设置标签的代表:

_label.attributedText = attributedText;

就是这样。我希望这对任何人都需要在_label.delegate = textViewDelegate;

中添加“可触摸”链接有所帮助

干杯,

答案 1 :(得分:0)

最简单的方法是将它们分成两个不同的标签,并将按钮框设置为第二个标签的框架。更难的方法是创建字符串大小并手动创建按钮的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;

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

然后使用UITextView代替UILabel并将您的班级指定为委托并实施

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

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

答案 4 :(得分:-1)

覆盖部分UILabel

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

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

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