iOS: создание метки программно с переносом слов

Я хочу создать метку программно, которая способна переносить слова для длинных предложений. Вот цикл, который у меня есть для создания меток:

        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

    }

Это не работает, хотя. Из того, что я прочитал, чтобы упаковка работала, вам нужно либо не устанавливать высоту, либо сделать высоту достаточно большой для содержимого. Я должен установить высоту для кадра, и я не хочу делать его слишком большим для больших предложений, так как я могу заставить это работать, устанавливая все программно?

2 ответа

Решение

Я решил вместо этого использовать TableView. Это дало мне именно то, что я искал. Если вам нужен отображаемый список предложений и требуется перенос слов для возможно больших предложений или абзацев, просмотр таблицы намного проще, чем возиться с добавлением меток программным способом. Вот шаги, за которыми я следовал:

  1. Следуйте этому уроку о том, как сделать табличное представление в Swift.
  2. добавлять cell.textLabel?.numberOfLines = 0 к функции, которая создает ячейки, чтобы получить перенос слов.
  3. добавлять yourtableview.estimatedRowHeight = whateveryouwant yourtableview.rowHeight = UITableViewAutomaticDimensionв вашем viewDidLoad для получения переменных высот для ваших строк.

Почему бы не использовать 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
    }

Важной частью является то, что вы устанавливаете число OfLines каждой метки как максимальный размер, который вы позволите метке расти.

Также я добавляю ограничение для минимальной высоты:

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

Это гарантирует, что метка будет иметь высоту не менее 25 и максимум 10 строк в этом примере.

Другие вопросы по тегам