【问题标题】:Get frame of word in a substring in a multiline label获取多行标签中子字符串中的单词框架
【发布时间】:2015-05-30 07:42:33
【问题描述】:

我想从包含 2 行的标签文本中查找单词的位置和大小。

假设这是我的标签:

 ____________
|            |
|This is the |
|            |
|label       |
|____________|

我想找到单词label 的框架,类似于{{0, 24}, {40, 24}},但使用

- (CGRect)getFrameOfString:(NSString *)substring fromString:(NSString *)string inLabel:(UILabel *)label {

    NSRange range = [string rangeOfString:substring];
    NSString *prefix = [string substringToIndex:range.location];
    NSStringDrawingContext *stringDrawingContext = [[NSStringDrawingContext alloc] init];

    stringDrawingContext.minimumScaleFactor = 0.5;

    CGRect prefixFrame = [prefix boundingRectWithSize:label.frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:[Util getAttributesforFont:label.font] context:stringDrawingContext];
    CGRect substringFrame = [substring boundingRectWithSize:label.frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:[Util getAttributesforFont:label.font] context:stringDrawingContext];

    prefixFrame = CGRectIntegral(prefixFrame);
    substringFrame = CGRectIntegral(substringFrame);

    return CGRectMake(prefixFrame.size.width, prefixFrame.origin.y, substringFrame.size.width, substringFrame.size.height);
}

我得到{{100, 0}, {40, 24}},好像这个词的位置如下:

 ____________
|            |
|This is the |label
|            |
|            |
|____________|

【问题讨论】:

    标签: objective-c nsstring uilabel


    【解决方案1】:

    我用这个解决了:

    + (CGRect)getFrameOfString:(NSString *)substring inLabel:(UILabel *)label {
    
        NSString *string = label.text;
        CGRect labelFrame = label.frame;
    
        NSRange substringRange = [string rangeOfString:substring];
        NSString *prefixString = [string substringToIndex:substringRange.location];
    
        NSStringDrawingContext *stringDrawingContext = [[NSStringDrawingContext alloc] init];
    
        stringDrawingContext.minimumScaleFactor = label.minimumScaleFactor;
    
        CGRect prefixFrame = [prefixString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, labelFrame.size.height) options:NSStringDrawingUsesLineFragmentOrigin attributes:[Util getAttributesforFont:label.font] context:stringDrawingContext];
        CGRect substringFrame = [substring boundingRectWithSize:labelFrame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:[Util getAttributesforFont:label.font] context:stringDrawingContext];
    
        prefixFrame = CGRectIntegral(prefixFrame);
        substringFrame = CGRectIntegral(substringFrame);
    
        NSInteger labelWidth = labelFrame.size.width;
    
        BOOL isOnNextLine = prefixFrame.size.width >= labelWidth;
    
        CGFloat left = prefixFrame.size.width - (isOnNextLine ? labelWidth : 0); // the substrings on the other lines are offset by the label frame's width
        CGFloat top = isOnNextLine ? substringFrame.size.height : 0; // the substrings on the other lines have the top position equal to it's height
        CGFloat width = substringFrame.size.width;
        CGFloat height = substringFrame.size.height;
    
        return CGRectMake(left, top, width, height);
    }
    

    我认为它现在只适用于有两行的标签。

    【讨论】:

    • 我可以在 swift 3 中使用这个吗?
    • 自己用 Swift 翻译应该不会太难。
    • 是的,然后是目标 C 源代码,我很快就做到了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2023-03-25
    • 2016-05-12
    • 2012-05-12
    • 2014-10-03
    相关资源
    最近更新 更多