使超链接在 UITextView
中可单击是微不足道的。您只需在IB的视图上设置“检测链接”复选框,它就会检测HTTP链接并将其转换为超链接。
然而,这仍然意味着用户看到的是“原始”链接。RTF文件和HTML都允许你设置一个用户可读的字符串,在它的“后面”有一个链接。
将属性化文本html" target="_blank">安装到文本视图(或UILabel
或UITextField
,就此而言。)但是,当属性化文本包含链接时,它是不可单击的。
有没有办法让用户可读的文本可以在UITextView
、UILabel
或UITextField
中单击?
SO上的标记是不同的,但这里是总体思路。我想要的是这样的文本:
这个变形是用Face Dancer生成的,在app store点击查看。
我唯一能得到的是这个:
这个变形是由脸舞者生成的,点击http://example.com/facedancer在应用商店查看。
我刚刚创建了UILabel的一个子类来专门处理此类用例。您可以轻松添加多个链接,并为它们定义不同的处理程序。它还支持在触摸时突出显示按下的链接以获得触摸反馈。请参阅https://github.com/null09264/FRHyperLabel.
在您的情况下,代码可能如下所示:
FRHyperLabel *label = [FRHyperLabel new];
NSString *string = @"This morph was generated with Face Dancer, Click to view in the app store.";
NSDictionary *attributes = @{NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]};
label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes];
[label setLinkForSubstring:@"Face Dancer" withLinkHandler:^(FRHyperLabel *label, NSString *substring){
[[UIApplication sharedApplication] openURL:aURL];
}];
示例屏幕截图(在本例中,处理程序被设置为弹出一个警告,而不是打开一个url)
我发现这很有用,但我需要在很多地方做,所以我将我的方法包装在一个简单的扩展中,扩展到NSMutableAttributedString
:
Swift 3
extension NSMutableAttributedString {
public func setAsLink(textToFind:String, linkURL:String) -> Bool {
let foundRange = self.mutableString.range(of: textToFind)
if foundRange.location != NSNotFound {
self.addAttribute(.link, value: linkURL, range: foundRange)
return true
}
return false
}
}
斯威夫特 2
import Foundation
extension NSMutableAttributedString {
public func setAsLink(textToFind:String, linkURL:String) -> Bool {
let foundRange = self.mutableString.rangeOfString(textToFind)
if foundRange.location != NSNotFound {
self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)
return true
}
return false
}
}
示例用法:
let attributedString = NSMutableAttributedString(string:"I love stackoverflow!")
let linkWasSet = attributedString.setAsLink("stackoverflow", linkURL: "http://stackoverflow.com")
if linkWasSet {
// adjust more attributedString properties
}
目标C
我刚刚达到了在一个纯Objective-C项目中做同样事情的要求,所以这里是Objective-C类别。
@interface NSMutableAttributedString (SetAsLinkSupport)
- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL;
@end
@implementation NSMutableAttributedString (SetAsLinkSupport)
- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL {
NSRange foundRange = [self.mutableString rangeOfString:textToFind];
if (foundRange.location != NSNotFound) {
[self addAttribute:NSLinkAttributeName value:linkURL range:foundRange];
return YES;
}
return NO;
}
@end
示例用法:
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:"I love stackoverflow!"];
BOOL linkWasSet = [attributedString setAsLink:@"stackoverflow" linkURL:@"http://stackoverflow.com"];
if (linkWasSet) {
// adjust more attributedString properties
}
使用NSMutableAttributedString。
NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"Google"];
[str addAttribute: NSLinkAttributeName value: @"http://www.google.com" range: NSMakeRange(0, str.length)];
yourTextView.attributedText = str;
编辑:
这与问题没有直接关系,只是澄清一下,< code>UITextField和< code>UILabel不支持打开URL。如果您想将< code>UILabel用于链接,可以选中TTTAttributedLabel。
此外,您应该将UITextView
的dataDetectorTypes
值设置为UIDataDetectorTypeLink
或UIDataDetectorTypeAll
以在单击时打开URL。或者您可以按照评论中的建议使用委托方法。
我有“下载正在进行文件”对话框活动。当用户按下“隐藏”按钮时,活动将创建通知和隐藏进度对话框。并且当用户单击到通知时,活动显示进度对话框再次出现在活动中。我如何在按下按钮“后退”时切换活动到后退任务?
有什么方法可以简化这段代码吗?我正好有一个白色的一块,想要得到它的位置 代码: 瓦片类: 件类:
我最近开始使用在我的android应用程序上播放流链接,比如和文件,但当我试图播放文件,以下消息开始出现在Android logcat中: 源错误。com.google.android.exoplayer2.source.无法识别的输入格式异常:输入不以#EXTM3U头开始。在com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist
我怎么能把这条线移到右边。我正在使用智能的想法,我使用了导致问题的自定义字体。
从Scala列表开始。 如何将其转换为可遍历一次?