Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Swift中的多行获取UILabel高度_Ios_Swift_Swift2_Uilabel - Fatal编程技术网

Ios 使用Swift中的多行获取UILabel高度

Ios 使用Swift中的多行获取UILabel高度,ios,swift,swift2,uilabel,Ios,Swift,Swift2,Uilabel,我试图计算UILabel的高度,以使页面可滚动。标签包含用于显示HTML内容的AttributeText 我正在使用此函数将我的HTML内容获取到UILabel: func stringFromHTML( string: String?) -> NSAttributedString { do{ let pStyle = NSMutableParagraphStyle() pStyle.lineSpacing = 4 pStyle.pa

我试图计算UILabel的高度,以使页面可滚动。标签包含用于显示HTML内容的AttributeText

我正在使用此函数将我的HTML内容获取到UILabel:

func stringFromHTML( string: String?) -> NSAttributedString
{
    do{
        let pStyle = NSMutableParagraphStyle()
        pStyle.lineSpacing = 4
        pStyle.paragraphSpacingBefore = 10

        let str = try NSMutableAttributedString(data:string!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true
            )!, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSNumber(unsignedLong: NSUTF8StringEncoding)], documentAttributes: nil)
        str.addAttribute(NSParagraphStyleAttributeName, value: pStyle, range: NSMakeRange(0, str.length))
        str.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica Neue", size: 16.0)!, range: NSMakeRange(0, str.length))

        return str
    } catch
    {
        print("html error\n",error)
    }
    return NSAttributedString(string: "")
}
我是个新手。因此,我做了一项研究,并找到了这个延伸,以获得UILabel的高度。它返回一个值,但我猜它不是真的。我的UIScrollView似乎不起作用:

extension UILabel{
    func requiredHeight() -> CGFloat{
        let label:UILabel = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.ByWordWrapping
        label.font = self.font
        label.text = self.text

        label.sizeToFit()

        return label.frame.height
    }
}
这是我在viewDidLoad()方法中为约束编写的代码:

// Set ContentView height
let activityTitleHeight:CGFloat = self.activityTitle.requiredHeight() + 20
let activityDescHeight:CGFloat = self.activityDesc.requiredHeight() + 20
let totalContentHeight:CGFloat = activityDescHeight + activityTitleHeight + 345
// There is an image view and a navigation, their total height: 345

let contentViewHeight:NSLayoutConstraint = NSLayoutConstraint(item: self.contentView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: totalContentHeight)
self.contentView.addConstraint(contentViewHeight)

提前谢谢

将此类文本放入UITextView是更好的方法。此元素用作具有以下内容的文本容器:

  • 多线支撑
  • 归属支持
  • 无论文本的长度如何,它都适合视图,因为它的工作方式与scrollview类似

即使你不使用故事板,我也只发布了一个小屏幕截图,这个UI元素给这个地方带来了什么属性


由于您希望在HTML内容大于应用程序窗口大小时,整个页面可以滚动,因此我假定您的顶层视图是
UIScrollView

这里的主要技巧是将显示HTML的标签的高度约束设置为
0
,然后在计算其包含的HTML文本的高度后以编程方式进行更新

如果显示的文本太长,则滚动视图将自动开始滚动,前提是您正确设置了所有垂直约束

顺便说一句,仅仅为了计算字符串的高度而创建
UILabel
是一种过分的做法。从iOS7开始,我们有一种方法可以计算使用给定选项绘制文本所需的最小rect:

string.boundingRectWithSize(CGSizeMake(width, CGFloat.max), options: [.UsesFontLeading, .UsesLineFragmentOrigin], context: nil)
回到您的问题,您应该创建一个ivar的
NSLayoutConstraint
类型,表示所讨论标签的高度:

class ViewController: UIViewController {
  @IBOutlet weak var htmlLabel: UILabel!
  private var labelHeightConstraint: NSLayoutConstraint!
  ...
并将其
constant
属性设置为
0
,如前所述:

override func viewDidLoad() {
  super.viewDidLoad()
  ...

  htmlLabel.text = stringFromHTML(htmlText)

  labelHeightConstraint = NSLayoutConstraint(item: htmlLabel, attribute: .Height, relatedBy: .Equal,
                                             toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: 0)
  scrollView.addConstraint(labelHeightConstraint)
}
然后计算标签的高度:

(由于我们在
viewDidLoad
中没有任何superview的精确的宽度,
ViewDidDisplay
是进行此类计算的好地方。)


我为您创建了一个测试项目,展示了我在上面所做的工作。您可以从下载。

谢谢您的回答。据我所知,它会自动滚动,对吗?我想滚动整个页面。这个解决方案是否可行?是的。您可以向元素添加约束,使其覆盖您喜欢的区域。
contentView
的类型是什么?它是滚动视图还是集合视图这样的可滚动容器?它是UIView。我将它用作其他元素的容器。当我尝试将更高的值传递给totalContentHeight时,它工作得非常好。非常感谢!你的测试项目帮了我很多,解决了我的问题。:)
override func viewDidLoad() {
  super.viewDidLoad()
  ...

  htmlLabel.text = stringFromHTML(htmlText)

  labelHeightConstraint = NSLayoutConstraint(item: htmlLabel, attribute: .Height, relatedBy: .Equal,
                                             toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: 0)
  scrollView.addConstraint(labelHeightConstraint)
}
override func viewDidAppear(animated: Bool) {
  super.viewDidAppear(animated)

  let maxSize = CGSizeMake(CGRectGetWidth(scrollView.frame), CGFloat.max)
  let textSize = htmlLabel.attributedText!.boundingRectWithSize(maxSize, options: [.UsesFontLeading, .UsesLineFragmentOrigin], context: nil)

  labelHeightConstraint.constant = ceil(textSize.height)
}