4

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

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

“没有账号?登录

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

很好地制作这个功能非常重要,可以在其他语言中使用相同的东西而不做任何事情:)

谢谢

4

5 回答 5

8

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

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 :使用在步骤4NSLinkAttributeName中创建的范围为可变字符串添加一个新的

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

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

_label.attributedText = attributedText;

7:设置标签的代表:

_label.delegate = textViewDelegate;

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

干杯,

于 2014-11-07T01:01:31.503 回答
0

如果您只是想从斜体文本触发一个动作,您应该NSLinkAttributeNameNSFontAttributeName. 选择任何你想要的链接,比如myapp://action1.

然后使用 aUITextView而不是 aUILabel并将您的类分配为委托并实现

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

在那里执行您想做的任何操作并返回 NO,这将阻止 Safari 启动。

于 2014-05-06T14:07:43.143 回答
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;
于 2013-06-24T14:49:50.783 回答
0

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

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

您还可以在标签上使用属性文本,使其看起来像一个链接(带有颜色和下划线)。

于 2013-06-24T14:54:10.223 回答
-2

覆盖部分UILabel

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

或者

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

或者

  • 从 UILabel 中删除 "Sign In" 并使其成为 UIButton 的标题
于 2013-06-24T15:05:06.983 回答