2017-06-16 28 views
1

我使用MyCustomView.xib编写了一个名为MyCustomView.swift的自定义视图类。 当我使用自定义视图不会通过在故事版中添加UIView来继承自定义类

let customView = MyCustomView(frame:.....) 
self.view.addSubView(customView) 

自定义视图将出现。

但是,当我直接在Storyboard中添加一个UIView,并选择MyCustomView作为Custom Class的类时,它不显示。即使我设置了UIView的背景色,它也不起作用。尤其是当我用注释的@IBDesignable MyCustomview两个错误警告showes,

Failed to render and update auto layout status fo XXXViewController 
Failed to update auto layout status 

这是否意味着我应该在故事板自定义视图设置自动布局?

这是MyCustomView.class

import UIKit 
@IBDesignable 
class MyCustomView:UIView{ 
@IBOutlet weak var categoryLabel: UILabel! 

var category:String = ""{ 
    didSet{ 
     self.categoryLabel.text = category 
    } 
} 
var intro:String = "" 
var address:String = "" 
var distance:CGFloat = 0.0 


override init(frame: CGRect) { 
    super.init(frame: frame) 
    awakeFromNib() 
    print("\(#function)") 
} 
convenience init(){ 
    print("\(#function)") 
    self.init(frame:CGRect.zero) 
} 

required init?(coder aDecoder: NSCoder) { 
    print("\(#function)") 
    super.init(coder: aDecoder) 
    awakeFromNib() 

} 

override func awakeFromNib() { 
    super.awakeFromNib() 
    let view = Bundle.main.loadNibNamed("MyCustomView", owner: self, options: nil)?.first as! UIView 
    view.autoresizingMask = UIViewAutoresizing.flexibleWidth.union(.flexibleHeight) 
    addSubview(view) 
} 
override func layoutSubviews() { 
    super.layoutSubviews() 
} 

} 
+0

请为您的MyCustomView类添加代码。你如何添加xib文件? – xmhafiz

+0

@hafiz这是我的MyCustomView.class代码 –

+0

@Leo我试过..... –

回答

1

你需要做的是前缀@IBInspectable之前你var小号。

下面是一个例子:自定义类:Rainbow.swift

import Foundation 
import UIKit 

@IBDesignable 
class Rainbow: UIView { 
    @IBInspectable var firstColor: UIColor = UIColor(red: (37.0/255.0), green: (252.0/255), blue: (244.0/255.0), alpha: 1.0) 
    @IBInspectable var secondColor: UIColor = UIColor(red: (171.0/255.0), green: (250.0/255), blue: (81.0/255.0), alpha: 1.0) 
    @IBInspectable var thirdColor: UIColor = UIColor(red: (238.0/255.0), green: (32.0/255), blue: (53.0/255.0), alpha: 1.0) 

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

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

    func addOval(_ lineWidth: CGFloat, path: CGPath, strokeStart: CGFloat, strokeEnd: CGFloat, strokeColor: UIColor, fillColor: UIColor, shadowRadius: CGFloat, shadowOpacity: Float, shadowOffsset: CGSize) { 

     let arc = CAShapeLayer() 
     arc.lineWidth = lineWidth 
     arc.path = path 
     arc.strokeStart = strokeStart 
     arc.strokeEnd = strokeEnd 
     arc.strokeColor = strokeColor.cgColor 
     arc.fillColor = fillColor.cgColor 
     arc.shadowColor = UIColor.black.cgColor 
     arc.shadowRadius = shadowRadius 
     arc.shadowOpacity = shadowOpacity 
     arc.shadowOffset = shadowOffsset 
     layer.addSublayer(arc) 
    } 

    override func draw(_ rect: CGRect) { 
     // Add ARCs 
     self.addCirle(80, capRadius: 20, color: self.firstColor) 
     self.addCirle(150, capRadius: 20, color: self.secondColor) 
     self.addCirle(215, capRadius: 20, color: self.thirdColor) 
    } 

    func addCirle(_ arcRadius: CGFloat, capRadius: CGFloat, color: UIColor) { 
     let X = self.bounds.midX 
     let Y = self.bounds.midY 

     // Bottom Oval 
     let pathBottom = UIBezierPath(ovalIn: CGRect(x: (X - (arcRadius/2)), y: (Y - (arcRadius/2)), width: arcRadius, height: arcRadius)).cgPath 
     self.addOval(20.0, path: pathBottom, strokeStart: 0, strokeEnd: 0.5, strokeColor: color, fillColor: UIColor.clear, shadowRadius: 0, shadowOpacity: 0, shadowOffsset: CGSize.zero) 

     // Middle Cap 
     let pathMiddle = UIBezierPath(ovalIn: CGRect(x: (X - (capRadius/2)) - (arcRadius/2), y: (Y - (capRadius/2)), width: capRadius, height: capRadius)).cgPath 
     self.addOval(0.0, path: pathMiddle, strokeStart: 0, strokeEnd: 1.0, strokeColor: color, fillColor: color, shadowRadius: 5.0, shadowOpacity: 0.5, shadowOffsset: CGSize.zero) 

     // Top Oval 
     let pathTop = UIBezierPath(ovalIn: CGRect(x: (X - (arcRadius/2)), y: (Y - (arcRadius/2)), width: arcRadius, height: arcRadius)).cgPath 
     self.addOval(20.0, path: pathTop, strokeStart: 0.5, strokeEnd: 1.0, strokeColor: color, fillColor: UIColor.clear, shadowRadius: 0, shadowOpacity: 0, shadowOffsset: CGSize.zero) 

    } 
} 

它借鉴Rainbow

来源:https://www.appcoda.com/ibdesignable-ibinspectable-tutorial/

尝试添加以下代码:

override func awakeFromNib() { 
     super.awakeFromNib() 
     xibSetup() 
    } 

    func xibSetup() { 
     guard let view = loadViewFromNib() else { return } 
     view.frame = bounds 
     view.autoresizingMask = 
        [.flexibleWidth, .flexibleHeight] 
     addSubview(view) 
     contentView = view 
    } 

    func loadViewFromNib() -> UIView? { 
     guard let nibName = nibName else { return nil } 
     let bundle = Bundle(for: type(of: self)) 
     let nib = UINib(nibName: nibName, bundle: bundle) 
     return nib.instantiate(
        withOwner: self, 
        options: nil).first as? UIView 
    } 
+0

谢谢!但是错误消失了,但UIView仍然没有显示。只能通过ViewController中的代码绘制视图。 –

+0

当您通过代码绘制视图时,只有在运行项目时才会看到效果。 – Prashant

+0

单击您的自定义视图对象,然后在身份检查器中将** _ Module_ **设置为'IBDesignable' ,如下所示http://imgur.com/a/t3LJR – Prashant

0

尝试删除@IBDesignable因为Xcode是寻找类IBInspectable特性,这是不存在的

+0

你说得对。但那不是我的重点。没有\ @IBDesignable,故事板中的uiview仍然无法显示。我认为\ @IBDesignable在另一个方面显示了我在使用自定义视图时的错误。但Viewcontroller中的代码视图效果很好。 –

+0

@周雪静,但删除'无法呈现和更新自动布局'的权利。添加'IBInspectable'属性可能会将其渲染到故事板 – xmhafiz

+0

不会有错误消失,但视图不会。我尝试使用代码来绘制视图。有用。但xib没有 –