基于 CGSIZE 的 NSString 字符串

NSString string based on CGSIZE

我有一个很长的 NSString 并且只想获取适合 CGSize 的字符串。

示例:

NSString *temp = @"jump jump jump jump jump jump";

CGSize = CGSizeMake(30,30);
UIFont *font = [UIFont fontwithName:@"helviticaNueue" fontSize:18];

请忽略语法。

从上面的细节我可以得到什么 NSString 适合 CGSize 并得到省略号。

以下问题仅returnsize/width: iOS 7 sizeWithAttributes: replacement for sizeWithFont:constrainedToSize

如果您的最终目标是将字符串放入具有固定宽度的 UILabel 中(我在这里做一个假设),那么只需将 NSString 分配给标签并让 UILabel 处理细节(即文本对齐、基线、换行符等)。

如果不是,那么您将不得不遍历字符串,每次增加一个字符的长度,并使用 UIStringDrawing 方法对其进行测量:

- (CGSize)sizeWithAttributes:(NSDictionary *)attrs

并且不要忘记先测量省略号的大小并将其考虑在内。

我刚刚在 NSString 上为最近的一个项目将其实现为一个类别,似乎运行良好。它目前适用于宽度,但您应该也可以调整它以使用高度。

NSString-Truncate.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface NSString (Truncate)

- (NSString *)stringByTruncatingToWidth:(CGFloat)width attributes:(NSDictionary *)textFontAttributes;

@end

NSString-Truncate.m

#import "NSString+Truncate.h"

@implementation NSString (Truncate)

- (NSString *)stringByTruncatingToWidth:(CGFloat)width attributes:(NSDictionary *)textFontAttributes {
    CGSize size = [self sizeWithAttributes:textFontAttributes];
    if (size.width <= width) {
        return self;
    }

    for (int i = 2; i < self.length; i++) {
        NSString *testString = [NSString stringWithFormat:@"%@…", [self substringToIndex:self.length - i]];
        CGSize size = [testString sizeWithAttributes:textFontAttributes];
        if (size.width <= width) {
            return testString;
        }
    }
    return @"";
}

@end