2016-09-19 46 views
2

我想通过编程方式创建一个能够对长句子进行自动换行的标签。这里是我创建标签的循环:iOS:使用Word Wrap编程创建标签

 for i in 0..<servicesLength 
    { 
     let label = UILabel(frame: CGRectMake(0, number, servicesScroll.bounds.size.width - 42, 25)) 
     label.lineBreakMode = .ByWordWrapping 
     label.numberOfLines = 0 
     label.font = UIFont(name: label.font.fontName, size: 25) 
     label.text = servicesList[i] 
     self.servicesScroll.addSubview(label) 
     number = number + 50 

    } 

虽然这并不奏效。从我读过的内容来看,为了让包装工作起来,你需要不设置高度或者使内容的高度足够大。我必须为框架设置高度,我不想让它对于大句子来说非常大,所以我怎么才能通过以编程方式设置所有内容来实现这个功能?

+0

所以我有它的工作,除了它似乎通过调整标签的高度抛出的东西。它将所有标签按照与更改高度相同的量向下推。这会在顶部产生大量的空白区域,并且一些标签会越过滚动视图的底部。我能做些什么来解决这个问题? – user1715916

回答

0

我决定改用TableView。它给了我我正在寻找的东西。如果你需要一个显示的句子列表,并且需要可能大句子或段落的单词换行,tableview比以编程方式添加标签困难得多。 下面是我遵循的步骤:

  1. 按照有关如何制作的tableview斯威夫特this教程。
  2. cell.textLabel?.numberOfLines = 0添加到创建单元格以获取单词换行的功能。
  3. 在您的viewDidLoad中添加yourtableview.estimatedRowHeight = whateveryouwant yourtableview.rowHeight = UITableViewAutomaticDimension 以获得您行的变量高度。
2

为什么不使用Autolayout,这也会让你支持设备的方向改变。

var lastLabel:UILabel? 

    for i in 0..<10servicesLength 
    { 
     let label = UILabel() 
     label.translatesAutoresizingMaskIntoConstraints=false 
     label.lineBreakMode = .ByWordWrapping 
     label.numberOfLines = 10 
     label.font = UIFont(name: label.font.fontName, size: 25) 
     label.text = servicesList[i] 
     servicesScroll.addSubview(label) 

     let metrics=["horizontalMargin":21,"top":0,"bottom":0,"separationBetweenLabels":0,"labelMinHeight":25] 
     let views=["label":label] 

     servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-horizontalMargin-[label]-horizontalMargin-|", 
      options: NSLayoutFormatOptions(rawValue: 0), 
      metrics: metrics, 
      views: views)) 

     if i == 0{ 
      servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-top-[label]", 
       options: NSLayoutFormatOptions(rawValue: 0), 
       metrics: metrics, 
       views: views)) 
     } 
     if let lastLabel=lastLabel{ 
      views["lastLabel"]=lastLabel 
      servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[lastLabel]-separationBetweenLabels-[label]", 
       options: NSLayoutFormatOptions(rawValue: 0), 
       metrics: metrics, 
       views: views)) 
     } 
     if i == (servicesLength-1){ 
      servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label]-bottom-|", 
       options: NSLayoutFormatOptions(rawValue: 0), 
       metrics: metrics, 
       views: views)) 
     } 

     //Optional a minimum height of 25 
     servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label(>=labelMinHeight)]", 
      options: NSLayoutFormatOptions(rawValue: 0), 
      metrics: metrics, 
      views: views)) 

     lastLabel=label 
    } 

的重要组成部分,是你设定每个标签作为你会允许标签增长的最大尺寸的numberOfLines。

而且我添加了一个约束的miminum高度:

//Optional a minimum height of 25 
    servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label(25)]", 
     options: NSLayoutFormatOptions(rawValue: 0), 
     metrics: metrics, 
     views: views)) 

这将保证该标签将至少为25的高度和最大的10线在这个例子。

+0

感谢您的留言。我不想支持横向定位,因为该应用在横向上看起来不太好。我试图避免在最大高度情况下的硬编码。我希望能够把它包装起来,直到完成。我有一些关于段落长度的字符串,而其他字符串只是一个句子。我尝试了一下你的代码和缺少的东西,它告诉我们标签的起始位置在哪里,因此它们都被放在彼此的顶部。 – user1715916

+0

所以我试着增加标签之间的高度和空间,让它们显示出来,但是在第一个标签之前,我在顶部获得了很多空的空间。空间似乎等于我为标签放置的高度。除了空间之外,一切看起来都很棒。我如何摆脱这一点? – user1715916

+0

对不起,我的代码中有错误,我更新了它。请再次检查一次,您应该对顶部的空间没有任何问题。 – omarzl