Как вы добавляете вставку к UILabel (iOS Swift)?

Я - разработчик Android, изучающий iOS. Как добавить дополнение (вставка) к UILabel в iOS Swift? Мне не удалось найти простой учебник по этому вопросу. Спасибо.

Также, как я могу добавить поля для элементов пользовательского интерфейса в Swift? Когда я пытаюсь выполнить приведенное ниже, ничего не обновляется (при нажатии "добавить ограничение" ).

введите описание изображения здесь

Ответы

Ответ 1

Это код, который нужно добавить в Swift 3:

class InsetLabel: UILabel {
    let topInset = CGFloat(0)
    let bottomInset = CGFloat(0)
    let leftInset = CGFloat(20)
    let rightInset = CGFloat(20)

    override func drawText(in rect: CGRect) {
        let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    override public var intrinsicContentSize: CGSize {
        var intrinsicSuperViewContentSize = super.intrinsicContentSize
        intrinsicSuperViewContentSize.height += topInset + bottomInset
        intrinsicSuperViewContentSize.width += leftInset + rightInset
        return intrinsicSuperViewContentSize
    }
}

Ответ 2

Вероятно, лучшая идея заключается в подклассе UILabel и переопределении drawTextInRect: следующим образом:

class InsetLabel: UILabel {
    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)))
    }
}

Ответ 3

нужно добавить следующее:

class InsetLabel: UILabel {
let topInset = CGFloat(12.0), bottomInset = CGFloat(12.0), leftInset = CGFloat(12.0), rightInset = CGFloat(12.0)

override func drawTextInRect(rect: CGRect) {
    let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
    super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}

override func intrinsicContentSize() -> CGSize {
    var intrinsicSuperViewContentSize = super.intrinsicContentSize()
    intrinsicSuperViewContentSize.height += topInset + bottomInset
    intrinsicSuperViewContentSize.width += leftInset + rightInset
    return intrinsicSuperViewContentSize
}
}

Ответ 4

Существует решение, просто использующее раскадровку. В раскадровке создайте объект UIView, целью которого будет окружение вашей метки, чтобы дать ей дополнение. Затем, также из раскадровки, поместите ваш UILabel внутри этой точки зрения. Теперь выберите объект UILabel и поднимите всплывающее окно "Добавить новые ограничения", щелкнув значок "Pin". Если вы хотите, чтобы прокладка по 5 вокруг UILabel, щелкните каждый из 4 красных I-балок в всплывающем окне "Добавить новые ограничения" и THEN типа 5 в каждом из четырех ящиков, расположенных рядом с I-лучами. Если вы сначала наберете 5, а затем щелкните I-Beam, XCode вернется к какому-либо значению в поле перед вводом 5. Наконец нажмите кнопку "Добавить ограничения".

В всплывающем окне "Добавить ограничения" XCode игнорирует значения верхнего, левого, правого или нижнего ограничений, для которых вы не нажали соответствующий красный I-луч. Вероятно, это ответ на вторую часть вашего вопроса.

Помните также о настройке ограничений добавляемого UIView. Если вы не определяете, где он находится в раскадровке (например, прикреплены к началу и слева от основного вида контроллера вида), ему не будет назначено местоположение по умолчанию, и оно может вообще не отображаться, когда вы запустите приложение.

Ответ 5

Другим способом было бы переопределить textRect: forBounds: limitedToNumberOfLines:

Возвращает прямоугольник чертежа для текста меток. Переопределить это метод в подклассах, требующий изменений в методах, ограничивающих прямоугольник должен произойти до того, как система выполнит другую текстовую компоновку расчеты. Используйте значение в параметре numberOfLines для ограничения высота возвращаемого прямоугольника до указанного количества строк текста. Этот метод может быть вызван системой, если был предыдущий вызовите метод sizeToFit() или sizeThatFits (_:). Обратите внимание, что метки в объектах UITableViewCell определяются размеры ячеек, а не по запрашиваемому размеру.

public class JPSLabel : UILabel
{
    open var textInsets: UIEdgeInsets = UIEdgeInsets.zero

    override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect
    {
        var insetBounds = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
        insetBounds.size.width += self.textInsets.left + self.textInsets.right
        insetBounds.size.height += self.textInsets.top + self.textInsets.bottom

        return insetBounds
    }
}