我正在创建一个自定义控件。 当我运行该程序时,自定义控件不会显示在iPhone 6和iPhone 6s模拟器上。在iPhone 7,iPhone 7 plus,iPhone SE等等。一切正常。
在我的控制中,我放了UIView
(backView
)在其上绘制路径,并在其上UIImageView
和UIButton
。这就像一个单按钮的酒吧。
以下是我的来源的一些相关部分
import UIKit
@IBDesignable
class ButtonBar: UIControl {
// -- MARK: controls
@IBOutlet weak var backView: UIView!
@IBOutlet weak var image: UIImageView!
@IBOutlet weak var actionButton: UIButton!
@IBOutlet weak var buttonTopConstraint: NSLayoutConstraint!
// -- MARK: customize properties
// some @IBInspectable properties here...
// -- MARK: other properties
weak var view: UIView!
var backgroundLayer: CAShapeLayer!
// -- MARK: init()s
override init(frame: CGRect) {
super.init(frame: frame)
setupSubViews()
}
convenience init() {
self.init(frame: CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupSubViews()
}
// -- MARK: override functions
override func layoutSubviews() {
guard view != nil else {
return
}
view.frame = bounds
self.refresh()
}
// -- MARK: other functions
func loadViewFromNib() -> UIView {
let clazz = type(of: self)
let bundle = Bundle(for: clazz)
let nib = UINib(nibName: "\(clazz)", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
return view
}
func setupSubViews() {
view = loadViewFromNib()
view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
self.addSubview(view)
self.backgroundLayer = CAShapeLayer()
self.backView.layer.addSublayer(self.backgroundLayer)
self.refresh()
}
public func refresh() {
let path = UIBezierPath()
// code to create the path...
path.close()
self.backgroundLayer.path = path.cgPath
self.backgroundLayer.fillColor = self.barColor.cgColor
self.backgroundLayer.strokeColor = self.borderColor.cgColor
self.backgroundLayer.lineWidth = CGFloat(self.borderWidth)
self.backView.layer.replaceSublayer(self.backgroundLayer, with: self.backgroundLayer)
self.image.image = self.buttonImage
self.buttonTopConstraint.constant = CGFloat(t - to)
}
}
我只是将UIView拖入我的故事板并将其类设置为此自定义控件。
如果我覆盖draw(_:)
函数并在其中调用refresh()
函数,则它适用于iPhone 6 [s]模拟器。但我知道,由于某些性能问题,这不是一个好习惯。
我的代码中是否有问题或只是iPhone 6 [s]模拟器的错误?
== update == 我将我的项目发送给使用xcode 8.2的其他人(我刚刚将其升级到8.3.1),他删除了底部约束并再次使用相同的值重新添加。问题已解决。
我收到了他发回给我的项目并删除了约束,然后再次添加。这个问题没有复制。虽然我对原始项目做了同样的事情,但问题仍然存在。
这是xcode的错误吗?