Пользовательский UIButton вызывает Storyboard Agent Cra sh Swift - PullRequest
0 голосов
/ 28 января 2020

Я создал собственный класс UIButton, и он вызвал сбой агента раскадровки. Я включаю мои расширения, потому что я действительно не знаю, в чем проблема. Я пытался отладить это представление из раскадровки, но оно отправляет меня прямо в код сборки. Я пытался сделать это без @IBDesignable, но это все равно вызывает cra sh. Также, если вы дадите советы по улучшению того, как я пишу свой класс, я буду рад их услышать. Я буду рад, если вы сможете мне помочь. Это мой класс:

@IBDesignable class customButton: UIButton{

    private let imagesPadding: CGFloat = 2
    private var ArrowSymbleImageView: UIImageView!

    @IBInspectable var iconImageInspectable: UIImage = UIImage(systemName: "globe")!{
          willSet {
            if (ArrowSymbleImageView != nil) {
                ArrowSymbleImageView.image = newValue
            }
         }
    }

    @IBInspectable var BackgroundColorInspectable: UIColor = .white {
         willSet {
            self.backgroundColor  = newValue
            if (ArrowSymbleImageView != nil) {
                if (self.BackgroundColorInspectable.isDarkColor) {
                   ArrowSymbleImageView.tintColor = .white
                }else{
                   ArrowSymbleImageView.tintColor = .black
                }
            }
         }
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.generalInit()
    }

    private func generalDeinit() {
        ArrowSymbleImageView.removeFromSuperview()
    }

    private func generalInit() {

        self.backgroundColor = self.BackgroundColorInspectable

        self.roundCorners(corners: [.bottomLeft], radius: self.width() / 2 * 0.7)
        self.dropShadow()


        let sizePartFromView: CGFloat = 4
        ArrowSymbleImageView = UIImageView(frame: CGRect(x: self.width() / 2 - (self.width() / sizePartFromView / 2),
                                                         y: self.height() / 2 - (self.height() / sizePartFromView / 2),
                                                         width: self.width() / sizePartFromView,
                                                         height: self.height() / sizePartFromView))
        ArrowSymbleImageView.image = self.iconImageInspectable
        if (self.BackgroundColorInspectable.isDarkColor) {
            ArrowSymbleImageView.tintColor = .white
        }else{
            ArrowSymbleImageView.tintColor = .black
        }
        ArrowSymbleImageView.contentMode = .scaleAspectFill
        self.addSubview(ArrowSymbleImageView)
    }
}


internal extension UIView {
   func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}


internal extension UIView {

    func dropShadow(scale: Bool = true, size: CGSize = CGSize(width: -2, height: 2)) {
    layer.masksToBounds = false
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.5
    layer.shadowOffset = size
    layer.shadowRadius = 1

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
  }

  func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = color.cgColor
    layer.shadowOpacity = opacity
    layer.shadowOffset = offSet
    layer.shadowRadius = radius

    layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
  }
}

internal extension UIColor
{
    var isDarkColor: Bool {
        var r, g, b, a: CGFloat
        (r, g, b, a) = (0, 0, 0, 0)
        self.getRed(&r, green: &g, blue: &b, alpha: &a)
        let lum = 0.2126 * r + 0.7152 * g + 0.0722 * b
        return  lum < 0.50 ? true : false
    }
}

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Не используйте принудительное развертывание, когда у вас нет подтверждения о данных, всегда используйте необязательное связывание и изменяйте следующую строку в коде из этого UIImage (systemName: "globe")! UIImage (названный: "глобус")! .

0 голосов
/ 29 января 2020

Я заметил это:

 UIImage(systemName: "globe")!

Есть ли причина, по которой вы создаете собственное изображение таким образом? Является ли «глобус» изображением по умолчанию, предоставленным яблоком?

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

UIImage(named:"globe")!
...