XXAttributedLabel
基于 TMAttributedLabel 实现,让 Label 也可以支持选择、复制等操作。
特性
- 支持 TMAttributedLabel 的所有特性
- 支持选择相关属性
触发时长
状态
放大镜状态
选中背景色
锚点颜色
选中文本
系统要求
- iOS 9.0 及以上
- 需要 ARC
集成
Podfile
pod 'XXAttributedLabel'
手动集成
git clone https://github.com/solehe/XXAttributedLabel
- 将
XXAttributedLabel
中的源代码复制到您的工程中
使用方法
基本使用
XXAttributedLabel *label = [[XXAttributedLabel alloc] initWithFrame:CGRectMake(20, 100, 335, 180)];
[label setBackgroundColor:[UIColor yellowColor]];
[label setLinkHighlightColor:[UIColor redColor]];
[label setLineSpacing:3.f];
[label setNumberOfLines:0];
[label setTag:1024];
[self.view addSubview:label];
[label append:@"风急天高猿啸哀,\n"];
[label append:@"渚清沙白鸟飞回。\n"];
[label append:@"无边落木萧萧下,\n"];
[label append:@"不尽长江滚滚来。\n"];
[label append:@"万里悲秋常作客,\n"];
[label append:@"百年多病独登台。\n"];
[label append:@"艰难苦恨繁霜鬓,\n"];
// 支持选择
[label setEnableSelected:YES];
长按链接
// 添加链接
NSString *linkString = @"无边落木萧萧下,";
NSRange range = [label.text rangeOfString:linkString];
[label addCustomLink:linkString forRange:range color:[UIColor blueColor]];
// 长按链接回调
[label setLongPressedLinkBlock:^(id _Nonnull linkData, LongPressedEndBlock _Nonnull block) {
NSString *linkString = nil;
if ([linkData isKindOfClass:[NSString class]]) {
linkString = linkData;
} else {
linkString = [label.text substringWithRange:[linkData rangeValue]];
}
// TODO 在这里处理链接长按事件
// ...
}];
点击链接
// 设置代理
[label setDelegate:self];
// 实现代理方法
- (void)attributedLabel:(TMAttributedLabel *)label clickedOnLink:(id)linkData {
if ([linkData isKindOfClass:[NSString class]]) {
NSLog(@"点击了链接:%@", linkData);
}
else {
NSLog(@"点击了链接:%@", [label.text substringWithRange:[linkData rangeValue]]);
}
}
copy
// 选择触发监听
__weak typeof(label) weak_label = label;
[label setSelectingListenBlock:^(BOOL selecting) {
if (selecting) {
[self.view becomeFirstResponder];
[[UIMenuController sharedMenuController] showMenuFromView:weak_label rect:weak_label.bounds];
} else {
[self.view resignFirstResponder];
[[UIMenuController sharedMenuController] hideMenu];
}
}];
// 放大镜触发监听
[label setMagnifyDisplayBlock:^(BOOL display) {
if (display) {
[[UIMenuController sharedMenuController] hideMenu];
} else {
[[UIMenuController sharedMenuController] showMenuFromView:weak_label rect:weak_label.bounds];
}
}];
#pragma mark - 重写父视图以下方法
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:)) {
return YES;
} else {
return NO;
}
}
- (void)copy:(id)obj {
XXAttributedLabel *label = [self.view viewWithTag:1024];
[[UIPasteboard generalPasteboard] setString:label.selectedText];
}
联系我
许可证
XXAttributedLabel 使用 [MIT 许可][MIT] 许可证,详情见 LICENSE 文件。