0

我有一个 UIView,它作为一个容器,这个容器的宽度需要根据最长的字符串动态变化。所以我想根据字符串长度获得 CGFloat/CGSize,还有可能吗?

似乎最有用的方法现在已贬值...

myStringSize : CGSize  = [longestString sizeWithFont:myFont 
                       constrainedToSize:maximumSize 
                       lineBreakMode:self.myLabel.lineBreakMode];

而不是基于一个标签,我想基于一个字符串

4

3 回答 3

0

您必须给出已知宽度或高度:

extension String {

    func getHeight(with width: CGFloat, font: UIFont) -> CGFloat {
        let maxSize = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)
        let actualSize = self.boundingRect(with: maxSize, options: [.usesLineFragmentOrigin], attributes: [NSFontAttributeName: font], context: nil)
        return actualSize.height
    }


    func getWidth(with height: CGFloat, font: UIFont) -> CGFloat {
        let maxSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: height)
        let actualSize = self.boundingRect(with: maxSize, options: [.usesLineFragmentOrigin], attributes: [NSFontAttributeName: font], context: nil)
        return actualSize.width
    }
}
于 2017-10-11T11:08:19.453 回答
0

1 - 首先定义你想要的最大尺寸MaxWidth

 CGSize constraint = CGSizeMake(MaxWidth, CGFLOAT_MAX);

2- 你的属性text

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [UIFont systemFontOfSize:FONT_SIZE], NSFontAttributeName, nil];

3-* 这是如何获取paraRectFrom text

CGRect paraRect = [text boundingRectWithSize:constraint options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil];

4-* 最终获得尺寸:

CGSize size = paraRect.size;
于 2017-10-11T11:28:50.797 回答
0

感谢您的帮助@Venkat,这是对我有用的解决方案

 @objc func containerWidth() -> (CGFloat){
        let containerSize = self.myLabel.intrinsicContentSize
        containerWidth = containerSize.width
        return containerWidth
    }
于 2017-10-11T11:43:21.397 回答