Пользовательский UILabel View не обновляет свой фрейм в Интерфейсном Разработчике - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь создать UILabel для Font Awesome, который до сих пор работает хорошо. У меня проблема в том, что когда я изменяю размер шрифта для метки в prepareForInterfaceBuilder(), он не отражается в Интерфейсном Разработчике.

Это мой код:

import Foundation
import UIKit

@IBDesignable
class FALabel : UILabel {

    @IBInspectable
    private var icon: String = ""

    @IBInspectable
    private var weight: NSInteger = 0

    /**
     * The type for the Font Awesome Label
     */
    enum FAType {
        case Brands
        case Light
        case Regular
        case Solid
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupView()
    }

    /**
     * Prepare the view or the Interface Builder.
     */
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setupView()
    }

    /**
     * Set up the view.
     */
    func setupView() {
        let type: FAType =  {
            switch self.weight {
            case 0:  return .Light
            case 2:  return .Solid
            case 3:  return .Brands
            default: return .Regular
            }
        }()

        setFontAwesomeIcon(faType: type, size: self.font.pointSize, icon: FAIcons.iconNamed(name: self.icon))
        self.sizeToFit()
        self.frame = CGRect(x: self.frame.minX, y:self.frame.minY, width:self.frame.width, height:self.frame.height)
        self.invalidateIntrinsicContentSize()
    }

    /**
     * Calculate the intrinsic content size.
     */
    override var intrinsicContentSize: CGSize {
        return CGSize(width: self.frame.width, height: self.frame.height)
    }

    /**
     * Set the Font Awesome Icon for the label.
     *
     * - parameter fatype: The type to set.
     * - parameter size:   The size for the font.
     * - parameter icon:   The icon to use.
     */
    func setFontAwesomeIcon(faType: FAType, size: CGFloat, icon:String) {
        if faType == .Regular {
            self.font = UIFont(name: "FontAwesome5Pro-Regular", size: size)
        } else if faType == .Solid {
            self.font = UIFont(name: "FontAwesome5Pro-Solid", size: size)
        } else if faType == .Light {
            self.font = UIFont(name: "FontAwesome5Pro-Light", size: size)
        } else if faType == .Brands {
            self.font = UIFont(name: "FontAwesome5Brands-Regular", size: size)
        }
        self.text = icon
    }
}

Когда я что-то изменяю в Интерфейсном Разработчике, кажется, что рамка остается того же размера, но сам значок рисуется больше, чем я хочу.

preview of problem

Iсчитал, что вызов self.sizeToFit() из prepareForInterfaceBuilder() должен изменить размер представления и изменить эти 15x18 измерения, но это не так.

1 Ответ

0 голосов
/ 15 октября 2019

Я думаю, что любые корректировки, связанные с размером, должны быть помещены в layoutSubviews.

override func layoutSubviews() {
   super.layoutSubviews()
   setupView()
}

. Вы можете использовать prepareForInterfaceBuilder для заполнения некоторых образцов данных, например, для предварительного просмотра в IB, но вы не должныВспомните настройку, которую вы уже выполнили в init методах (например, setupView()).

Вы также можете опустить init методы, которые я предполагаю, и упростить все до:

import Foundation
import UIKit

@IBDesignable
class FALabel : UILabel {

    @IBInspectable
    public var icon: String = "" { 
        didSet { setupView() } 
    }

    @IBInspectable
    public var weight: NSInteger = 0 { 
        didSet { setupView() } 
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        setupView()
    }

    /**
     * The type for the Font Awesome Label
     */
    enum FAType {
        case Brands
        case Light
        case Regular
        case Solid
    }

    /**
     * Set up the view.
     */
    func setupView() {
        let type: FAType =  {
            switch self.weight {
            case 0:  return .Light
            case 2:  return .Solid
            case 3:  return .Brands
            default: return .Regular
            }
        }()

        setFontAwesomeIcon(faType: type, size: self.font.pointSize, icon: FAIcons.iconNamed(name: self.icon))
        self.sizeToFit()
        self.frame = CGRect(x: self.frame.minX, y:self.frame.minY, width:self.frame.width, height:self.frame.height)
        self.invalidateIntrinsicContentSize()
    }

    /**
     * Calculate the intrinsic content size.
     */
    override var intrinsicContentSize: CGSize {
        return CGSize(width: self.frame.width, height: self.frame.height)
    }

    /**
     * Set the Font Awesome Icon for the label.
     *
     * - parameter fatype: The type to set.
     * - parameter size:   The size for the font.
     * - parameter icon:   The icon to use.
     */
    func setFontAwesomeIcon(faType: FAType, size: CGFloat, icon:String) {
        if faType == .Regular {
            self.font = UIFont(name: "FontAwesome5Pro-Regular", size: size)
        } else if faType == .Solid {
            self.font = UIFont(name: "FontAwesome5Pro-Solid", size: size)
        } else if faType == .Light {
            self.font = UIFont(name: "FontAwesome5Pro-Light", size: size)
        } else if faType == .Brands {
            self.font = UIFont(name: "FontAwesome5Brands-Regular", size: size)
        }
        self.text = icon
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...