iOS 计算富文本,检索网址,号码,表情,并且计算高度,设置最大行数

iOS YYLabel计算富文本高度 利用YYLabel准确计算富文本的高度,可用于带表情的评论 立即下载

前言:项目中用到检索表情,网址与号码,但是看了TTTAttributeLabel,emojyLabel,奈何都不太满意,plist格式不太符合,而且这两个第三方用到检索都是系统自带的检索,检测网址方面不准确, 所以就需要自己使用正则进行检索。

关于以上两个三方检索不准确的可以参考:检索网址

接下来写一下实现的过程, 没有高度封装,仅供参考

关于网址与号码的正则再说明下:

网址:KURlREGULAR @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)?)|(((http[s]{0,1}|ftp)://|)((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)?)"

号码: KPHONENUMBERREGLAR @"\d{3}-\d{8}|\d{4}-\d{7}|\d{11}"

比如我要转的字符串为

@"简书:http://jianshu.com哈哈哈[调皮][流汗][偷笑][再见][可爱][色][害羞][委屈][委屈][抓狂][酷][酷][嘘][嘘][龇牙][大哭][大哭][大哭][龇牙][嘘][嘘][调皮][调皮]哈哈哈哈[嘘][调皮][调皮]18637963241他大舅他二舅都是舅,高桌子地板头都是木头"

我需要做的是检索网址并且替换为和微博一样的链接,号码和链接有选中状态,因为UITextview有检测url 的方法可以添加点击事件,所以就采用UITextview进行封装。主要采取正则表达式与RegexKitLite配合做检索

1 . 首先建立一个模型,把文字检索为富文本,检索出 表情,网址以及号码。中间需要使用一个模型存储检索出来的结果。对于特殊符号的表情建立一个模型。其实富文本的都是逐个检索,然后处理,最后拼接为一个NSMutableAttributedString。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ZLStatus : NSObject
//源内容
@property (nonatomic, copy) NSString *text;

/**    string    信息内容 -- 带有属性的(特殊文字会高亮显示\显示表情)*/
@property (nonatomic, copy) NSAttributedString *attributedText;

@end
#import "ZLStatus.h"
#import "ZLSpecial.h"
#import "ZLTextPart.h"
#import "RegexKitLite.h"
@implementation ZLStatus
- (void)setText:(NSString *)text
{
    _text = [text copy];

    // 利用text生成attributedText
    self.attributedText = [self attributedTextWithText:text];
}
/**
 *  普通文字 --> 属性文字
 *
 *  @param text 普通文字
 *
 *  @return 属性文字
 */
- (NSAttributedString *)attributedTextWithText:(NSString *)text
{
    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] init];

    // 表情的规则
    NSString *emotionPattern = @"\\[[0-9a-zA-Z\\u4e00-\\u9fa5]+\\]";
    // @的规则
    NSString *atPattern = @"@[0-9a-zA-Z\\u4e00-\\u9fa5-_]+";
    // #话题#的规则
    NSString *topicPattern = @"#[0-9a-zA-Z\\u4e00-\\u9fa5]+#";
    // url链接的规则
    NSString *urlPattern = @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(((http[s]{0,1}|ftp)://|)((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)";
    NSString *phoneNumber =@"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[3578]+\\d{9}|\\d{8}|\\d{7}"
    ;
    NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@|%@|%@", emotionPattern, atPattern, topicPattern, urlPattern,phoneNumber];

    // 遍历所有的特殊字符串
    NSMutableArray *parts = [NSMutableArray array];
    [text enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
        if ((*capturedRanges).length == 0) return;

        ZLTextPart *part = [[ZLTextPart alloc] init];
        part.special = YES;
        part.text = *capturedStrings;
        part.emotion = [part.text hasPrefix:@"["] && [part.text hasSuffix:@"]"];
        part.range = *capturedRanges;
        [parts addObject:part];
    }];
    // 遍历所有的非特殊字符
    [text enumerateStringsSeparatedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
        if ((*capturedRanges).length == 0) return;

        ZLTextPart *part = [[ZLTextPart alloc] init];
        part.text = *capturedStrings;
        part.range = *capturedRanges;
        [parts addObject:part];
    }];

    // 排序
    // 系统是按照从小 -> 大的顺序排列对象
    [parts sortUsingComparator:^NSComparisonResult(ZLTextPart *part1, ZLTextPart *part2) {
        // NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending
        // 返回NSOrderedSame:两个一样大
        // NSOrderedAscending(升序):part2>part1
        // NSOrderedDescending(降序):part1>part2
        if (part1.range.location > part2.range.location) {
            // part1>part2
            // part1放后面, part2放前面
            return NSOrderedDescending;
        }
        // part1<part2
        // part1放前面, part2放后面
        return NSOrderedAscending;
    }];

    UIFont *font = [UIFont systemFontOfSize:15];
    NSMutableArray *specials = [NSMutableArray array];
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"face.plist" ofType:nil];
    NSArray  *face = [NSArray arrayWithContentsOfFile:filePath];
    // 按顺序拼接每一段文字
    for (ZLTextPart *part in parts) {
        // 等会需要拼接的子串
        NSAttributedString *substr = nil;
        if (part.isEmotion) { // 表情  表情处理的时候,需要根据你自己的plist进行单独处理,像一些第三方里自定义的plist,格式要是也是很严格的
            NSString *str = [text substringWithRange:part.range];
            for (int i = 0; i < face.count; i ++) {
                if ([face[i][@"face_name"] isEqualToString:str]) {
                    //face[i][@"png"]就是我们要加载的图片
                    //新建文字附件来存放我们的图片,iOS7才新加的对象
                    NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
                    //给附件添加图片
                    textAttachment.image = [UIImage imageNamed:face[i][@"face_image_name"]];
                    //调整一下图片的位置,如果你的图片偏上或者偏下,调整一下bounds的y值即可
                    textAttachment.bounds = CGRectMake(0, -6, 25, 25);
                    //把附件转换成可变字符串,用于替换掉源字符串中的表情文字
                   substr = [NSAttributedString attributedStringWithAttachment:textAttachment];

                    break;
                }
            }

        } else if (part.special) { // 非表情的特殊文字
            NSURL *url =[NSURL URLWithString:part.text];
            if (url.scheme) {
                substr = [[NSAttributedString alloc] initWithString:part.text attributes:@{
                                                                                           NSForegroundColorAttributeName : [UIColor redColor]
                                                                                           }];

               NSString *string =@"网页链接";
                            NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
                                //给附件添加图片
                                textAttachment.image = [UIImage imageNamed:@"链接"];
                                //调整一下图片的位置,如果你的图片偏上或者偏下,调整一下bounds的y值即可
                                textAttachment.bounds = CGRectMake(0, -6, 25, 25);
                NSMutableAttributedString *tempAttribute = [[NSMutableAttributedString alloc]initWithAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];
                 NSMutableAttributedString *tempAttribute2 = [[NSMutableAttributedString alloc]initWithAttributedString:[NSAttributedString attributedStringWithAttachment:textAttachment]];
                NSAttributedString *text =[[NSAttributedString alloc]initWithString:string attributes:@{NSForegroundColorAttributeName:[UIColor blueColor]}];
                [tempAttribute appendAttributedString:text];
                substr = [[NSAttributedString alloc]initWithAttributedString:tempAttribute];
                // 创建特殊对象

                ZLSpecial *s = [[ZLSpecial alloc] init];
                s.text = string;
              //需要添加附属图片的长度,负责点击范围会变化
                NSUInteger loc = attributedText.length+tempAttribute2.length;
                NSUInteger len = string.length;
                s.range = NSMakeRange(loc, len);
                s.urlString = part.text;
                [specials addObject:s];
            }else{

                NSLog(@"%@",part.text);
                substr = [[NSAttributedString alloc] initWithString:part.text attributes:@{
                                                                                           NSForegroundColorAttributeName : [UIColor redColor]
                                                                                           }];
                // 创建特殊对象
                ZLSpecial *s = [[ZLSpecial alloc] init];
                s.text = part.text;
                NSUInteger loc = attributedText.length;
                NSUInteger len = part.text.length;
                s.range = NSMakeRange(loc, len);
                s.urlString = part.text;
                [specials addObject:s];
            }



        } else { // 非特殊文字
            substr = [[NSAttributedString alloc] initWithString:part.text];
        }
        [attributedText appendAttributedString:substr];
    }

    // 一定要设置字体,保证计算出来的尺寸是正确的
    [attributedText addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, attributedText.length)];
    [attributedText addAttribute:@"specials" value:specials range:NSMakeRange(0, 1)];

    return attributedText;
}

中间存储检索结果与特殊字符的model:
#import <Foundation/Foundation.h>

@interface ZLTextPart : NSObject
/** 这段文字的内容 */
@property (nonatomic, copy) NSString *text;
/** 这段文字的范围 */
@property (nonatomic, assign) NSRange range;
/** 是否为特殊文字 */
@property (nonatomic, assign, getter = isSpecical) BOOL special;
/** 是否为表情 */
@property (nonatomic, assign, getter = isEmotion) BOOL emotion;


@end
#import <Foundation/Foundation.h>

@interface ZLSpecial : NSObject
/** 这段特殊文字的内容 */
@property (nonatomic, copy) NSString *text;
/** 这段特殊文字的范围 */
@property (nonatomic, assign) NSRange range;
@property(nonatomic,copy)NSString *urlString;
设置完内容后我们需要计算内容高度,然后复制给Textview,建立一个Frame模型。
#import <Foundation/Foundation.h>
#import "ZLStatus.h"
@interface ZLFrame : NSObject

//设置

/** 限制最大行数  这一步必须在设置完contentLabelF之后设置*/
@property(nonatomic,assign)int  maxNumLine;
@property(nonatomic,strong)ZLStatus *status;
@property(nonatomic,assign)CGFloat frameX;
@property(nonatomic,assign)CGFloat frameY;
@property(nonatomic,assign)CGFloat maxWidth;
//取值
/**   */
/** 正文 */
@property (nonatomic, assign) CGRect contentLabelF;
@property(nonatomic,assign)CGRect   maxNumLabelF;

@end
#import "ZLFrame.h"
@interface ZLFrame()
//检测高度的label;
@property(nonatomic,strong)UILabel *templateLabel;
@end
@implementation ZLFrame
-(void)setStatus:(ZLStatus *)status{
    _status = status;
    CGSize contentSize = [status.attributedText boundingRectWithSize:CGSizeMake(self.maxWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
    self.contentLabelF = (CGRect){{self.frameX , self.frameY}, contentSize};

}
-(void)setMaxNumLine:(int)maxNumLine{
    _maxNumLine = maxNumLine;

    self.templateLabel.frame =CGRectMake(self.frameX, self.frameY, self.maxWidth, 0);
    self.templateLabel.attributedText = self.status.attributedText;
    self.templateLabel.numberOfLines = maxNumLine;
    [self.templateLabel sizeToFit];
    self.maxNumLabelF = self.templateLabel.frame;

}
-(void)setFrameX:(CGFloat)frameX{
    _frameX = frameX;
}
-(void)setFrameY:(CGFloat)frameY{
    _frameY = frameY;
}
-(void)setMaxWidth:(CGFloat)maxWidth{
    _maxWidth = maxWidth;
}

-(UILabel *)templateLabel{
    if (!_templateLabel) {
        _templateLabel =[[UILabel alloc]init];

    }
    return _templateLabel;
}
@end





最后自定义Textview,引入Frame模型
#import <UIKit/UIKit.h>
#import "ZLFrame.h"
@interface ZLStatusTextView : UITextView
/** 所有的特殊字符串(里面存放着HWSpecial) */
@property (nonatomic, strong) NSArray *specials;
@property(nonatomic,strong)ZLFrame *zlFrame;
@property(nonatomic,assign)int maxLine;
@property(nonatomic,assign)BOOL isShowAll;//是否全部显示
@end
#import "ZLStatusTextView.h"
#import "ZLSpecial.h"
#define ZLStatusTextViewCoverTag 999
@implementation ZLStatusTextView
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        self.editable = NO;
        self.textContainerInset = UIEdgeInsetsMake(0, -5, 0, -5);
        // 禁止滚动, 让文字完全显示出来
        self.scrollEnabled = NO;
    }
    return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 触摸对象
    UITouch *touch = [touches anyObject];

    // 触摸点
    CGPoint point = [touch locationInView:self];

    NSArray *specials = [self.attributedText attribute:@"specials" atIndex:0 effectiveRange:NULL];
    BOOL contains = NO;

    for (ZLSpecial *special in specials) {
        self.selectedRange = special.range;
        // self.selectedRange --影响--> self.selectedTextRange
        // 获得选中范围的矩形框
        NSArray *rects = [self selectionRectsForRange:self.selectedTextRange];
        // 清空选中范围
        self.selectedRange = NSMakeRange(0, 0);

        for (UITextSelectionRect *selectionRect in rects) {
            CGRect rect = selectionRect.rect;
            if (rect.size.width == 0 || rect.size.height == 0) continue;

            if (CGRectContainsPoint(rect, point)) { // 点中了某个特殊字符串
                contains = YES;
                break;
            }
        }

        if (contains) {
            for (UITextSelectionRect *selectionRect in rects) {
                CGRect rect = selectionRect.rect;
                if (rect.size.width == 0 || rect.size.height == 0) continue;

                UIView *cover = [[UIView alloc] init];
                cover.backgroundColor = [UIColor greenColor];
                cover.frame = rect;
                cover.tag = ZLStatusTextViewCoverTag;
                cover.layer.cornerRadius = 5;
                [self insertSubview:cover atIndex:0];
            }

            break;
        }
    }

    // 在被触摸的特殊字符串后面显示一段高亮的背景
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 触摸对象
        UITouch *touch = [touches anyObject];

        // 触摸点
        CGPoint point = [touch locationInView:self];

        NSArray *specials = [self.attributedText attribute:@"specials" atIndex:0 effectiveRange:NULL];
        BOOL contains = NO;

        for (ZLSpecial *special in specials) {
            self.selectedRange = special.range;
            // self.selectedRange --影响--> self.selectedTextRange
            // 获得选中范围的矩形框
            NSArray *rects = [self selectionRectsForRange:self.selectedTextRange];
            // 清空选中范围
            self.selectedRange = NSMakeRange(0, 0);

            for (UITextSelectionRect *selectionRect in rects) {
                CGRect rect = selectionRect.rect;
                if (rect.size.width == 0 || rect.size.height == 0) continue;

                if (CGRectContainsPoint(rect, point)) { // 点中了某个特殊字符串
                    contains = YES;
                    break;
                }
            }

            if (contains) {
                for (UITextSelectionRect *selectionRect in rects) {
                    CGRect rect = selectionRect.rect;
                    if (rect.size.width == 0 || rect.size.height == 0) continue;

                    if (special.urlString) {
                        NSString *urlStr = special.urlString;
                        NSURL *url =[NSURL URLWithString:urlStr];
                        if (url.scheme) {
                            [[UIApplication sharedApplication]openURL:url];
                        }else{
                            NSMutableString *str=[[NSMutableString alloc] initWithFormat:@"tel:%@",special.text];
                            UIWebView *callWebview = [[UIWebView alloc] init];
                            [callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]];
                            [self addSubview:callWebview];
                    }
                    }
                }

                break;
            }
        }

        [self touchesCancelled:touches withEvent:event];
    });
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 去掉特殊字符串后面的高亮背景
    for (UIView *child in self.subviews) {
        if (child.tag == ZLStatusTextViewCoverTag) [child removeFromSuperview];
    }
}
-(void)setZlFrame:(ZLFrame *)zlFrame{
    _zlFrame = zlFrame;
    self.attributedText = zlFrame.status.attributedText;
    self.frame = zlFrame.contentLabelF;


}
-(void)setMaxLine:(int)maxLine{
    _maxLine = maxLine;
    [self.zlFrame setMaxNumLine:maxLine];
    self.frame = self.zlFrame.maxNumLabelF;
}
-(void)setIsShowAll:(BOOL)isShowAll{
    _isShowAll = isShowAll;
    if (isShowAll) {
        self.frame = self.zlFrame.contentLabelF;

    }else{
        [self setMaxLine:3];
    }
}
@end

最后在ViewController里引入即可:

#import "ViewController.h"
#import "ZLStatusTextView.h"
#define kTempText  @"简书:http://jianshu.com哈哈哈[调皮][流汗][偷笑][再见][可爱][色][害羞][委屈][委屈][抓狂][酷][酷][嘘][嘘][龇牙][大哭][大哭][大哭][龇牙][嘘][嘘][调皮][调皮]哈哈哈哈[嘘][调皮][调皮]18637963241他大舅他二舅都是舅,高桌子地板头都是木头"
#define  KURlREGULAR @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(((http[s]{0,1}|ftp)://|)((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"
#define KPHONENUMBERREGLAR @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[3578]+\\d{9}|\\d{8}|\\d{7}"
#import "ZLStatus.h"
#import "ZLFrame.h"
#import "LxButton.h"
@interface ViewController ()<UITextViewDelegate>
@property(nonatomic,strong)ZLStatusTextView *textview;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.textview =[[ZLStatusTextView alloc]initWithFrame:CGRectMake(20, 100, 250, 200)];
    ZLStatus *status = [[ZLStatus alloc]init];
    status.text = kTempText;


    ZLFrame *zlFrame =[[ZLFrame alloc]init];
    zlFrame.frameX = self.textview.frame.origin.x;
    zlFrame.frameY = self.textview.frame.origin.y;
    zlFrame.maxWidth = self.textview.frame.size.width;
    zlFrame.status = status;

    self.textview.zlFrame = zlFrame;
    //设置最大行数用于展开
    self.textview.maxLine = 3;
    self.textview.isShowAll = YES;
    [self.view addSubview:self.textview];
    self.textview.backgroundColor =[UIColor lightGrayColor];


    LxButton *button =[LxButton LXButtonWithTitle:@"限制最大行数" titleFont:[UIFont systemFontOfSize:15] Image:nil backgroundImage:nil backgroundColor:[UIColor brownColor] titleColor:[UIColor blueColor] frame:CGRectMake(20, 40, 150, 40)];

    [self.view addSubview:button];
    __weak ViewController *weakSelf = self;
    [button addClickBlock:^(UIButton *button) {

        weakSelf.textview.isShowAll =!weakSelf.textview.isShowAll;
    }];

}


@end

demo地址:富文本检索表情,网址,替换链接,限制最大输入行





链接:http://www.jianshu.com/p/77c3b27f8858

ios-TextView计算限制行数(swift).zip TextView计算限制行数(swift) 立即下载

相关推荐

隔离型全桥LLC谐振变化器建模及参数设计资料【仿真+设计报告+计算书】

内容概要:本文档系统性地提供了隔离型全桥LLC谐振变换器的建模、仿真与参数设计全套技术资料,涵盖Simulink/Plecs仿真模型、详细设计报告及Mathcad计算书,内容涉及开环与闭环控制、软启动过程、恒压恒流双闭环竞争控制等多种工况。资料还拓展至多相交错LLC、双向CLLC拓扑以及V2G(Vehicle-to-Grid)电动汽车充放电等前沿应用场景,并融合状态估计算法(如卡尔曼滤波、扩展卡尔曼滤波、粒子滤波)与神经网络技术进行系统性能优化,配套PPT说明与高水平EI期刊复现案例,为电力电子领域的科研与工程设计提供完整的技术支撑; 适合人群:适用于电力电子、电气工程及其自动化等相关专业的高校研究生、科研人员,以及从事高频DC-DC变换器、新能源电源系统开发的工程师,具备扎实电路理论基础和Matlab/Simulink仿真能力者尤佳; 使用场景及目标:①支撑LLC谐振变换器相关的科研课题、学位论文或项目开发;②开展高频高效电源的参数设计、效率优化与动态响应分析;③学习并复现高水平期刊中先进的控制策略,如变频控制、混合移相控制及智能优化算法;④掌握Simulink/Matlab在电力电子系统建模、控制算法实现与状态估计中的综合应用; 阅读建议:建议结合仿真模型、Mathcad计算书与设计报告三位一体同步研习,重点理解主电路参数设计与闭环控制逻辑之间的耦合关系,优先运行典型算例并调试关键模块,有条件者可进一步推进至硬件原型验证,并积极探索状态估计与人工智能算法在电力系统动态建模中的融合应用。

iOS 计算富文本,检索网址,号码,表情,并且计算高度,设置最大行数(聊天表情计算)

前言:项目中用到检索表情,网址与号码,但是看了TTTAttributeLabel,emojyLabel,奈何都不太满意,plist格式不太符合,而且这两个第三方用到检索都是系统自带的检索,检测网址方面不准确, 所以就需要自己使用正则进行检索。 关于以上两个三方检索不准确的可以参考:检索网址 接下来写一下实现的过程, 没有高度封装,仅供参考 关于网址与号码的正则再说明下

jueyi1127的博客 847

开源LocalAI本地人工智能安装教程

LocalAI是一款能在本地运行的人工智能应用,它兼容了OpenAI API规范,它可以在普通的电脑运行,不需要GPU,也不需要联网,音频转录

2301_78652552的博客 3613

iOS-图文混排方案-2种方案

iOS-图文混排方案-2种方案

u013712343的博客 949

Visual MODFLOW Flex 6.1新手入门:从数据导入到3D建模的完整工作流解析

本文为Visual MODFLOW Flex 6.1新手提供了从零开始构建地下水数值模型的完整工作流指南。详细解析了从项目规划、数据准备与导入,到构建三维概念模型、生成并运行数值模型,直至结果可视化与校准的核心步骤。帮助水文地质与环工领域初学者快速掌握这一专业软件,高效完成从数据到三维建模的全过程。

a1b2c的博客 800

Python爬虫-汽车之家各车系月销量榜数据

本文是该专栏的第41篇,后面会持续分享python爬虫干货知识。本文以某汽车平台为例,基于python采集该平台“各车系月销量”的榜单数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 1619

UITextField小结

//初始化textfield并设置位置及大小      UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]   //设置边框样式,只有设置了才会显示边框样式    text.borderStyle = UITextBorderStyleRoundedRect;  type...

不积跬步 无以至千里 不积小流 无以成江海 302

Exploring Automated Distractor Generation for Math Multiple-choice Questions via Large Language Mode

多项选择题(MCQ)在几乎所有级别的教育中都无处不在,因为它们易于管理、评分,并且是评估和实践中可靠的格式。MCQ最重要的方面之一是干扰因素,即旨在针对真实学生常见错误或误解的不正确选项。迄今为止,对于教师和学习内容设计师来说,制作高质量的干扰物的任务在很大程度上仍然是一个劳动和时间密集型的过程,其可扩展性有限。在这项工作中,我们研究了数学MCQ领域的自动干扰物生成任务,并探索了从上下文学习到微调的各种基于大型语言模型(LLM)的方法。

c_cpp_csharp的专栏 317

iOS计算富文本(NSMutableAttributedString)高度

有时候开发中我们为了样式好看, 需要对文本设置富文本属性, 设置完后那么怎样计算其高度呢, 很简单, 方法如下: - (NSInteger)hideLabelLayoutHeight:(NSString *)content withTextFontSize:(CGFloat)mFontSize { NSMutableParagraphStyle *par...

anqi0114的博客 1182

利用插件扩展 Qt 应用程序

不仅 Qt 本身可以通过插件进行扩展,而且 Qt 应用程序也可以通过插件来扩展,这需要应用程序使用 `QPluginLoader` 检测和加载插件。

青春不老,奋斗不止! 1万+

13、超声断层乳腺图像融合算法:乳腺癌诊断新突破

本文介绍了一种新型超声断层乳腺图像融合算法,通过结合超声透射(UTTc、UTTα)和反射断层图像(URT),实现对乳腺组织的多参数自动可视化。该算法能有效区分良性与恶性肿瘤,具有高准确性、无辐射、低成本等优势,适用于大规模乳腺癌早期筛查。初步临床测试验证了其可行性,未来有望成为乳腺癌诊断的新标准。

9q8w7e6r5的博客 154

iOS NSMutableAttributedString/NSAttributedString 富文本设置

http://stackoverflow.com/questions/11031623/how-can-i-use-attributedtext-in-uilabel //UILabel 设置NSAttributedString NSMutableParagraphStyle *ps = [[NSMutableParagraphStyle alloc] init]; [ps s

wenluma的专栏 6万+

无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程

当您遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息时,请按照上述步骤来解决问题。当您尝试加载文件C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1时,可能会遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息。请注意,更改执行策略可能会带来一些安全风险。

PixelInk的博客 1921

CoreText进阶(四) 文字行数限制和显示更多

本文的主要内容是使用CoreText如何进行行数的限制,以及设置了行数限制末尾的内容被截断了怎么设置截断的标识。此外,还有如何设置自定义的截断标识字符串(比如“显示更多”)、设置自定义截断标识字符串的点击事件等的相关讨论 其它文章: CoreText入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更...

weixin_33881041的博客 460

C# NX二次开发-查找连续倒圆角面

可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。这个是初步思路,如果有更好的思路可回复讨论一下。

fhqiwmc的博客 617

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

iOS 计算UILable显示文字所需要的行数

iOS 计算UILable显示文字所需要的行数场景:​ 项目中经常有一些这样的需求,在页面上有可能会显示有一段很长的文字,但是呢为了显示效果,就会限制显示行数,如果感兴趣就点击按钮展开。思路:​ 所谓行数,可以这样理解,先计算出展示这段文字一行所需要的宽度,然后拿这个宽度除以label的宽度,得到值向上取整就是行数。实现:​ 写了一个UILabel分类,添加了一个方法,主要步骤写了注释。

myfei2的专栏 8627

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IOS 富文本 ,设置行间距、字间距,计算高度(转载组合而成)

一 计算高度 -(CGFloat)getSpaceLabelHeight:(NSString*)str withFont:(UIFont*)font withWidth:(CGFloat)width {    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStylealloc] init];    paraStyle.lineBr...

2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

boundingRectWithSize 的使用, 计算UILable高度, 包含Emoji及多属性string.

iOS的文字高度计算一直是个问题, 苹果也一直在改, 这几天看了一下boundingRectWithSize方法. - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context NS_AVAILABL...

weixin_34177064的博客 304

iOS小知识:计算字符串长度(如果有表情,表情的长度为1)

在做项目的时候,textField能够输入表情,但是iOS的表情是占两个字符的,再计算字符串长度的时候就和想象的不一样了,所以用了次方法会将表情的长度转成1,最后得到的字符串的长度就是能看到的实际的长度。 方法中用到了iOS的表情编码,看不懂具体是什么,但是知道那些就是表情的编码,根据这个编码就能够找到具体是那个表情了。 此方法参考自:http://blog.youkuaiyun.com/liu...

weixin_30922589的博客 885

苹果爸爸Bug之NSTextAttachment

NSTextAttachment 自定义后的循环引用问题 NSTextAttachment的封装类 #import "DDAutoFitTextAttachment.h" @implementation DDAutoFitTextAttachment /** 重载此方法 使得图片的大小和行高是一样的。 @param textContainer textContainer @pa...

weixin_34080951的博客 455

iOS 动态计算获取字数的行数

接触iOS肯定会用到根据字体大写,和显示字体区域宽度获取行数的方法。这里有一个版本限制很少的,使用方便的方法,与大家一起分享。 /** @method 获取指定宽度情况ixa,字符串value的高度 @param value 待计算的字符串 @param fontSize 字体的大小 @param andWidth 限制字符串显示区域的宽度 @result float 返回的高度 *

王绵杰的个人博客 4084

关于iOS中动态获取获得字体的行数的更新

记得之前写过关于iOS中根据控件的大小获取字体行数的文章,当时粗略看了一下,稍作分享,今日细看甚有差错。在之前的方法里- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode 只是用在7.0版本之前,所以当你运行在7.0之后的设

王绵杰的个人博客 764

android开发:获取键盘的高度(实测真实有效)

由于最近在做即时通讯,做类似于微信的点击键盘消失,弹出表情页面(表情页面的高度和键盘的高度一致),于是在网上看了好多android测键盘高度的代码,都多多少少有些问题,于是我自己进行重新编写,终于弄了一个比较ok的测量高度的代码。//一个静态变量存储高度 public static int keyboardHeight = 0; boolean isVisiableForLast = fal

s297165331的专栏 4695

获取android软键盘高度

获取android软键盘高度,虽然是在网上找的方法,不过已亲自测试过,这方法转载太多了,不知道谁是原著了,原作者莫怪。感谢原作者。 MainActivity.java public class MainActivity extends Activity { private TextView textView; @Override protected void onC

fydsw1314的专栏 7475

动态获取键盘的高度

1 给键盘添加监听事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myKeyBoardAction:) name:UIKeyboardDidShowNotification object:nil]; 2 实现监听方法 1 - (void)myKeyBoardAction...

weixin_30289831的博客 89
上一篇: Apple Configurator用法(MDM黑白名单实现)
下一篇: swift3.0 入门学习笔记之一 基础篇
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值