如何获取NSString的大小
在Objective-C中,如果想要获取NSString的大小,需要使用Core Graphics来测量字符串在指定字体和大小下的渲染宽度。在Stack Overflow上有一个问题Measuring the pixel width of a string,提供了解决方法。
解决方法如下:
1. 首先,需要导入Core Graphics框架:
#import
2. 然后,使用下面的代码来获取字符串的大小:
NSString *string = @"Hello, World!"; UIFont *font = [UIFont systemFontOfSize:17.0]; // 指定字体和大小 CGSize size = [string sizeWithAttributes:@{NSFontAttributeName: font}]; CGFloat width = size.width; CGFloat height = size.height;
通过以上代码,可以得到字符串的宽度和高度。
这是因为NSString类中没有直接提供获取字符串大小的方法,所以需要使用Core Graphics来进行测量。以上代码中,我们首先创建了一个字符串和一个UIFont对象,然后使用sizeWithAttributes方法来获取字符串在指定字体和大小下的大小。
希望这篇文章能帮助到你解决如何获取NSString的大小的问题。
如何获取NSString的大小
在使用Objective-C或Swift编程时,有时候需要获取NSString的大小。一个常见的问题是如何获取NSString的宽度和高度。下面是一种解决方法。
Objective-C:
- (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font { CGSize size = CGSizeZero; if (text) { 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; }
Swift 3.0:
func findHeight(forText text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize {
var size = CGSize.zero
if !text.isEmpty {
var frame = text.boundingRect(withSize: CGSize(width: widthValue, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
size = CGSize(width: frame.size.width, height: frame.size.height + 1)
}
return size
}
上面的代码展示了如何使用boundingRectWithSize方法来计算NSString的大小。这个方法接受一个CGSize参数,用于限制字符串的宽度和高度。我们可以将宽度设置为所需的值,而将高度设置为一个很大的值(如CGFloat.greatestFiniteMagnitude),以便字符串可以根据其内容自动调整高度。
在Objective-C中,我们使用NSFontAttributeName来指定字体属性。而在Swift中,我们使用NSAttributedString.Key.font来指定字体属性。
这个方法返回一个CGSize对象,其中包含了字符串的宽度和高度。
为什么要加1?
在上述代码中,我们将字符串的高度加1。这是因为boundingRectWithSize方法返回的高度可能略微小于实际高度,加1可以确保字符串的高度不会被截断。
然而,其实有一种更好的方法来处理这个问题,就是使用ceilf()函数来取整。以下是一个更好的实现:
size = CGSize(width: ceilf(frame.width), height: ceilf(frame.height))
这样可以确保获取到的字符串大小是一个整数值,避免了可能的小数精度问题。
本文介绍了如何获取NSString的大小。我们使用boundingRectWithSize方法来计算字符串的宽度和高度。在Swift中,我们使用NSAttributedString.Key.font来指定字体属性。为了避免可能的高度截断问题,我们可以将字符串的高度加1或使用ceilf()函数来取整。这些方法能够帮助我们在编程中准确获取字符串的大小。
问题的出现原因:有用户提出了一个问题,即如何获取一个NSString的大小。用户可能遇到了这个问题,因为他想要在界面上显示一个字符串,并且希望根据字符串的大小来确定显示的布局。
解决方法:为了解决这个问题,用户可以使用以下代码来获取字符串的大小:
CGSize maximumSize = CGSizeMake(300, 9999); NSString *myString = @"This is a long string which wraps"; UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14]; CGSize myStringSize = [myString sizeWithFont:myFont constrainedToSize:maximumSize lineBreakMode:self.myLabel.lineBreakMode];
在代码中,用户设置了一个最大的大小,然后使用`sizeWithFont:constrainedToSize:lineBreakMode:`方法来获取字符串的大小。然后,用户可以将获取到的高度与已知只有一行高的元素的高度进行比较。如果获取到的高度更大,用户需要对文本进行裁剪。用户可以在再次进行比较之前在字符串中添加省略号(...)。
用户可以将这段代码放在一个循环中来不断裁剪文本,并再次检查正确的高度。
这个解决方法可以解决用户的问题,并且还提供了一些额外的技巧,如在比较大小之前添加省略号。
需要注意的是,如果用户使用的是iOS 7,可以参考提供的链接获取更多关于解决这个问题的方法。
然而,有其他用户表示上述方法并不起作用,`NSString.StringSize`方法无论使用什么参数都只返回单行的高度。这个问题可能是方法本身的缺陷所致。用户希望有人能解释为什么会出现这种情况,或者提供更好的解决方法。
本文介绍了一个关于如何获取NSString大小的问题,并提供了一种解决方法。解决方法使用了一个特定的代码段来获取字符串的大小,并提供了一些额外的技巧。同时,本文还提到了一个关于iOS 7的解决方法。最后,本文提到了另一位用户对解决方法的反馈,并希望能有人提供更好的解决方案。