UIlabel中的uilabel 点击部分文字字能不能实现点击

iOS长按UIlabel实现可复制功能
作者:Sunshine_tt
字体:[ ] 类型:转载 时间:
在我们日常的开发中经常会遇到一些小需求,比如需要长按控件来拷贝控件中得内容,所以这篇文章跟大家分享下iOS中长按UIlabel实现可复制功能的方法,有需要的朋友们可以参考借鉴。
相信大家都知道在iOS中有三个控件自身是支持拷贝,粘贴的,如:UITextField,UITextView,UIWebView。但是,有时候我们会遇到需要长按UIlabel,弹出“复制”item,来实现可复制。那该怎么办呢?下面就来一起看看吧。
首先UIKit中提供给我们几个类
在开始之前,我们需要自定义一个WINCopyLabel继承UILable
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self pressAction];
// 初始化设置
- (void)pressAction {
self.userInteractionEnabled = YES;
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
longPress.minimumPressDuration = 1;
[self addGestureRecognizer:longPress];
1、UIResponder:通过这个类实现UILabel可以响应事件(我们知道UIlabel是不能成为响应者的,所以这里需要重写),控制需要响应的事件
// 使label能够成为响应事件
- (BOOL)canBecomeFirstResponder {
return YES;
// 控制响应的方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
return action == @selector(customCopy:);
2、UIPasteboard:该类支持写入和读取数据,类似剪贴板
- (void)customCopy:(id)sender {
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = self.
3、UIMenuController:可以通过这个类实现在点击内容,或者长按内容时展示出复制、剪贴、粘贴等选择的项,每个选项都是一个UIMenuItem对象
- (void)longPressAction:(UIGestureRecognizer *)recognizer {
[self becomeFirstResponder];
UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"拷贝" action:@selector(customCopy:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:copyItem, nil]];
[[UIMenuController sharedMenuController] setTargetRect:self.frame inView:self.superview];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
一、UIResponderStandardEditActions:这是苹果给NSObject写的一个分类,其中包含了我们常用的复制,粘贴,全选等方法
- (void)cut:(nullable id)sender
NS_AVAILABLE_IOS(3_0);
- (void)copy:(nullable id)sender
NS_AVAILABLE_IOS(3_0);
- (void)paste:(nullable id)sender
NS_AVAILABLE_IOS(3_0);
- (void)select:(nullable id)sender
NS_AVAILABLE_IOS(3_0);
- (void)selectAll:(nullable id)sender
NS_AVAILABLE_IOS(3_0);
- (void)delete:(nullable id)sender
NS_AVAILABLE_IOS(3_2);
当我们,选中弹出的item时,系统会调用上面对应的方法
二、.以下是剪贴板中可以放置的内容(除了字符串,也可以拷贝图片,URL等)
&&&&& 1.UIPasteboardTypeListString 字符串数组, 包含kUTTypeUTF8PlainText
&&&&&&2.UIPasteboardTypeListURL URL数组,包含kUTTypeURL
&&&&& 3.UIPasteboardTypeListImage 图形数组, 包含kUTTypePNG 和kUTTypeJPEG
&&&&& 4.UIPasteboardTypeListColor 颜色数组
以上就是这篇文章的全部内容了,希望能对各位iOS开发者们有所帮助,如果有疑问大家可以留言交流。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Posts - 142,
Articles - 1,
Comments - 7
10:36 by JG2014, ... 阅读,
xcode中默认的UILabel是垂直居中对齐的,如果你的UILabel高度有多行,当内容少的时候,会自动垂直居中。
如下图所示(图片来自stackoverflow):
比较郁闷的是,UILabel并不提供设置其垂直对齐方式的选项。所以如果你想让你的文字顶部对齐,那么就需要自己想办法了。
上提供了几种方法来达到顶部对齐的效果。
在显示文字时,首先计算显示当前的文字需要多宽和多高,然后将对应的UILabel的大小改变成对应的宽度和高度。此方法的相示意图如下:
在显示文字时,首先计算显示当前的文字需要多宽和多高,然后将对应的UILabel的大小改变成对应的宽度和高度。此方法的相示意图如下:
(大部分时候可以通过:设置label最大frame和最大 numberofline,[label &sizetofit] 可以自动根据内容条件label大小。
CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont
constrainedToSize:maximumSize
lineBreakMode:self.dateLabel.lineBreakMode];
CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);
self.dateLabel.frame = dateFrame;
此方法更加简单粗暴,但是很有效。其方法是在文本后面加多一些\n。 需要注意的是,\n后还得加至少一个空格,否则多余的\n会被UILabel忽略。从这一点上看,UILabel似乎又过于&聪明&了。
该方法的示意图如下:
该方法的代码如下:
for(int i=0; i&newLinesToPad; i++)
self.text = [self.text stringByAppendingString:@"\n "];
最正统的方法,利用objective-c的category特性,修改UILabel的绘制代码。示例代码如下:
// -- file: UILabel+VerticalAlign.h
#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
// -- file: UILabel+VerticalAlign.m
@implementation UILabel (VerticalAlign)
- (void)alignTop {
CGSize fontSize = [self.text sizeWithFont:self.font];
double finalHeight = fontSize.height * self.numberOfLines;
double finalWidth = self.frame.size.width;
//expected width of label
CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
int newLinesToPad = (finalHeight
- theStringSize.height) / fontSize.height;
for(int i=0; i&newLinesToPad; i++)
self.text = [self.text stringByAppendingString:@"\n "];
- (void)alignBottom {
CGSize fontSize = [self.text sizeWithFont:self.font];
double finalHeight = fontSize.height * self.numberOfLines;
double finalWidth = self.frame.size.width;
//expected width of label
CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
int newLinesToPad = (finalHeight
- theStringSize.height) / fontSize.height;
for(int i=0; i&newLinesToPad; i++)
self.text = [NSString stringWithFormat:@" \n%@",self.text];
我选了简单暴力的方法二,你呢?
在iOS中默认的UILabel中的文字在竖直方向上只能居中对齐,从UILabel继承了一个新类,实现了居上对齐,居中对齐,居下对齐。具体如下:
#import&&UIKit/UIKit.h&&&
typedef&enum&&
&&&&VerticalAlignmentTop&=&0,&
&&&&VerticalAlignmentMiddle,&&
&&&&VerticalAlignmentBottom,&&
}&VerticalA&&
@interface&myUILabel&:&UILabel&&
@private&&
VerticalAlignment&_verticalA&&
@property&(nonatomic)&VerticalAlignment&verticalA&&
#import&"myUILabel.h"&&
@implementation&myUILabel&&
@synthesize&verticalAlignment&=&verticalAlignment_;&&
-&(id)initWithFrame:(CGRect)frame&{&&
&&&&if&(self&=&[super&initWithFrame:frame])&{&&
&&&&&&&&self.verticalAlignment&=&VerticalAlignmentM&&
&&&&return&&&
-&(void)setVerticalAlignment:(VerticalAlignment)verticalAlignment&{&&
&&&&verticalAlignment_&=&verticalA&&
&&&&[self&setNeedsDisplay];&&
-&(CGRect)textRectForBounds:(CGRect)bounds&limitedToNumberOfLines:(NSInteger)numberOfLines&{&&
&&&&CGRect&textRect&=&[super&textRectForBounds:bounds&limitedToNumberOfLines:numberOfLines];&&
&&&&switch&(self.verticalAlignment)&{&&
&&&&&&&&case&VerticalAlignmentTop:&&
&&&&&&&&&&&&textRect.origin.y&=&bounds.origin.y;&&
&&&&&&&&&&&&&&
&&&&&&&&case&VerticalAlignmentBottom:&&
&&&&&&&&&&&&textRect.origin.y&=&bounds.origin.y&+&bounds.size.height&-&textRect.size.&&
&&&&&&&&&&&&&&
&&&&&&&&case&VerticalAlignmentMiddle:&&
&&&&&&&&&&&&
&&&&&&&&default:&&
&&&&&&&&&&&&textRect.origin.y&=&bounds.origin.y&+&(bounds.size.height&-&textRect.size.height)&/&2.0;&&
&&&&return&textR&&
-(void)drawTextInRect:(CGRect)requestedRect&{&&
&&&&CGRect&actualRect&=&[self&textRectForBounds:requestedRect&limitedToNumberOfLines:self.numberOfLines];&&
&&&&[super&drawTextInRect:actualRect];&&
在使用时:
lbl_mylabel&=&[[myUILabel&alloc]&initWithFrame:CGRectMake(20,&50,&150,&600)];&&
UIColor&*color&=&[UIColor&colorWithPatternImage:[UIImage&imageNamed:@"halfTransparent.png"]];
lbl_mylabel.backgroundColor&=&&&
lbl_mylabel.textAlignment&=&UITextAlignmentL&&
lbl_mylabel.textColor&=&UIColor.whiteC&&
lbl_mylabel.lineBreakMode&=&UILineBreakModeWordW&&
lbl_mylabel.numberOfLines&=&0;&&
[lbl_mylabel&setVerticalAlignment:VerticalAlignmentTop];&&
[self&addSubview:lbl_mylabel];&问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
用NSAttributedString做UILabel,比如我将里面的URL部分通过正则表达式获取出来,然后高亮,那么我如何让这高亮的部分响应用户点击事件呢
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
方法一:使用第三方库
方法二:使用一个UITextView,设置为无法编辑,开启内容检测,如self.textView.text =self.textView.editable = NO;self.textView.dataDetectorTypes = UIDataDetectorTypeL
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App

我要回帖

更多关于 uilabel 点击部分文字 的文章

 

随机推荐