在iOS 7中获取NSString高度[重复]

Posted

技术标签:

【中文标题】在iOS 7中获取NSString高度[重复]【英文标题】:Get the NSString height in iOS 7 [duplicate] 【发布时间】:2014-02-25 12:20:41 【问题描述】:

我正在使用下面的代码从字符串长度计算标签的高度。我使用的是 xcode 5.0,它在 ios 6 模拟器中运行良好,但在 iOS 7 中运行不佳。

NSString* str = [[array objectAtIndex:i]valueForKey:@"comment"];

CGSize size = [className sizeWithFont:[UIFont systemFontOfSize:15]   
 constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap];

Height_1 = size.height;

如果有任何适用于 iOS 7 的解决方案,请提供帮助。 提前致谢

【问题讨论】:

我的票数不多,但这是骗局:***.com/questions/18897896/… 这也可能是相关的:***.com/questions/18903304/… 【参考方案1】:

这是我用来计算 iOS 6 和 iOS 7 高度的解决方案,我传递了一些参数以使其可重用。

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

/**
*  This method is used to calculate height of text given which fits in specific width having    font provided
*
*  @param text       Text to calculate height of
*  @param widthValue Width of container
*  @param font       Font size of text
*
*  @return Height required to fit given text in container
*/

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font

    CGFloat result = font.pointSize + 4;
    if (text)
    
        CGSize textSize =  widthValue, CGFLOAT_MAX ;       //Width and height of text area
        CGSize size;
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
        
            //iOS 7
            CGRect frame = [text boundingRectWithSize:textSize
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@ NSFontAttributeName:font 
                                          context:nil];
            size = CGSizeMake(frame.size.width, frame.size.height+1);
        
        else
        
            //iOS 6.0
            size = [text sizeWithFont:font constrainedToSize:textSize lineBreakMode:NSLineBreakByWordWrapping];
        
        result = MAX(size.height, result); //At least one row
    
    return result;

希望这会有所帮助,是的,任何建议都会受到赞赏。快乐编码:)

对于 iOS 7 及更高版本,请使用以下方法。

+ (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font 
    CGSize size = CGSizeZero;
    if (text) 
        //iOS 7
        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@ NSFontAttributeName:font  context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height + 1);
    
    return size;

【讨论】:

感谢编辑@Maverick 为什么在此处添加+1size = CGSizeMake(frame.size.width, frame.size.height+1); 我在我的应用程序中使用了自定义字体,这导致了轻微的高度问题,所以我添加了 +1 来解决这个问题。【参考方案2】:

试试这个

#define FONT_SIZE 15.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 20.0f


NSString *text;
CGSize constraint;
CGSize size;
CGFloat height;

text = [[array objectAtIndex:i]valueForKey:@"comment"];
constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

CGRect textRect = [text boundingRectWithSize:constraint
                                    options:NSStringDrawingUsesLineFragmentOrigin
                                    attributes:@NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE]
                                    context:nil];

size = textRect.size;


height = size.height;

【讨论】:

+1 表示boundingRectWithSize:options:attributes:context:,-1 表示定义而不是 const 静态变量。 注意boundingRectWithSize:options:attributes:context:仅适用于iOS7及以上。 @Zaph 感谢您的反馈。我是 iOS 编码的新手。我应该使用静态变量而不是使用定义?他们会让我的代码快速执行吗?或者他们实际上做了什么。请指导。 ***.com/questions/1674032/static-const-vs-define-in-c @0x7fffffff 感谢您的解释。【参考方案3】:
sizeWithFont

已弃用。使用

[string sizeWithAttributes:@NSFontAttributeName:[UIFont systemFontOfSize:15]];

改为

【讨论】:

【参考方案4】:

使用下面的代码获取标签的高度

CGSize szMaxCell = CGSizeMake(220, 2999);
UIFont *font = [UIFont systemFontOfSize:14.0f];    // whatever font you're using to display
CGSize szCell = [yourString sizeWithFont:font constrainedToSize:szMaxCell lineBreakMode:NSLineBreakByWordWrapping];

【讨论】:

你建议 OP 做一些他们已经尝试过的事情。 sizeWithFont:constrainedToSize:lineBreakMode: 在 iOS7 中已弃用,请使用:boundingRectWithSize:options:attributes:context:

以上是关于在iOS 7中获取NSString高度[重复]的主要内容,如果未能解决你的问题,请参考以下文章

iOS中NSFileManager文件常用操作整合

iOS plist文件操作

iOS plist文件操作

如何获取iOS设备屏幕的高度和宽度[重复]

iOS UILabel自定义行间距时获取高度

ios 怎么访问caches下的文件