2017-10-11 79 views
0

我有一个UIView,它充当一个容器,并且此容器的宽度需要根据最长的字符串动态更改。所以我想根据字符串长度得到CGFloat/CGSize,它仍然有可能吗?如何获得基于字符串长度的CGFloat/CGSize?

这似乎是最有帮助的现在贬值的方法...

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

而不是其基础上的标签上,我想将它基于一个String

+0

的可能的复制【如何基于文本的长度计算的UILabel宽?](https://stackoverflow.com/questions/3527494/how-to-calculate-uilabel-width-based-on -text-length) – Venkat

+0

@Venkat谢谢你的链接,不幸的是它是从7年前,这就是为什么现在方法折旧:( – Maja

+0

检查该链接中的所有答案。希望这会帮助你 。 'yourLabel.intrinsicContentSize.width'。 7年的老答案也可以给你的解决方案('boundingRect'):第 – Venkat

回答

0

感谢您的帮助@Venkat,这是工作的解决方案编辑我

@objc func containerWidth() -> (CGFloat){ 
     let containerSize = self.myLabel.intrinsicContentSize 
     containerWidth = containerSize.width 
     return containerWidth 
    } 
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 
    } 
} 
0

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

CGSize constraint = CGSizeMake(MaxWidth, CGFLOAT_MAX); 

2-属性为您text

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

3- *这是如何获得的paraRecttext

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

4- *最后得到尺寸:

CGSize size = paraRect.size;