iOS实用_可点击部分文字label

前言:最近又有同事问我如何做一个并排的label,部分label可点击,举个例子:qq红包中的”24小时未领完,将退回余额”中的“余额”可以点击,于是我把自己一年前的小轮子拿出来,本着帮助他人和提升自己的态度,跟大家分享下这个居中可点击的label

qq红包

可能很多朋友看到可点击label,会有很多想法:

1、label+label
2、label+button

当然还有很多,上面只是最常见的想法。
我这个demo是选择前者,因为后者文字间会出现缝隙,也就是“退回”和“余额”之间有空隙,看起来很不好看,原因是“余额”如果是buttontitle,我们都知道buttontititlebutton中的titleLabel.texttitleLabelbuttonedge,所以buttontitle跟“24小时未领完,将退回余额”的label一定会有空隙。效果的话,大家将一个labelbutton并排再看,在此我就不上图了。
.h文件
.h文件定义个block,用于点击操作,重写init方法

#import <UIKit/UIKit.h>
//点击按钮
typedef void (^clickBlock)();
@interface PCBClickLabel : UIView
- (instancetype)initLabelViewWithLab:(NSString *)text clickTextRange:(NSRange)clickTextRange clickAtion:(clickBlock)clickAtion;
@property (nonatomic, copy)clickBlock clickBlock;
@end

.m文件
.m文件在init方法对label.text进行截取和区分,区分出点击的文字是哪些,点击的文字在整个label分3种情况:

1、选择的范围文字是开头的文字
2、选择的范围文字是文中的文字
3、选择的范围文字是文末的文字(qq红包属于此种)

下面粘贴上第3种的判断代码

 //如果选择的范围文字是文尾的文字,而不是中间的文字或者开头的文字
if (clickTextRange.location + clickTextRange.length == text.length) {
//取得文字
clickText = [text substringWithRange:clickTextRange];
commonText = [text substringToIndex:clickTextRange.location];
//label的位置
commonLabel.frame = CGRectMake(0, 0, [[self class] calculateRowWidth:commonText], 30);
clickLabel.frame = CGRectMake(commonLabel.frame.size.width+commonLabel.frame.origin.x, 0, [[self class] calculateRowWidth:clickText], 30);
}

计算高度方法(此方法也可以用于label自适应高度,稍微修改一下即可)

+ (CGFloat)calculateRowWidth:(NSString )string {
NSDictionary
dic = @{NSFontAttributeName:[UIFont systemFontOfSize:17]}; //指定字号
CGRect rect = [string boundingRectWithSize:CGSizeMake(0, 30)/计算宽度时要确定高度,计算高度时要确定宽度/ options:NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading attributes:dic context:nil];
return rect.size.width;
}

效果图:

部分文字点击
block打印

完整代码:https://github.com/DWadeIsTheBest/clickLabel/tree/master

IT文库 » iOS实用_可点击部分文字label
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址