Ich lerne gerade, wie man benutzerdefinierte UIViews erstellt. Diese spezielle Ansicht, die ich mache, enthält ein paar Knöpfe. Ich bemerkte, wenn ich die Eigenschaft frame/height innerhalb des Lazy-Instantiierungsblocks aufruft, erhalte ich den Wert 128, aber wenn ich die Eigenschaft height für das Argument rect in der Funktion drawRect zusammen mit den Grenzen anrufe, erhalte ich den Wert 94.UIView Grenzen/Rahmen passt nicht zu drawRect
Ich verstehe nicht, warum die Eigenschaften bounds/frame width/height, die von der drawRect-Funktion aufgerufen werden, nicht mit der im Initialisierer verwendeten Rahmen-/Begrenzungshöhe und -breite übereinstimmen. Kann jemand das erklären?
@IBDesignable
class GroupingMetaDataView: UIView {
@IBInspectable var strokeColor: UIColor =
UIColor.blackColor().colorWithAlphaComponent(0.4)
@IBInspectable var strokeWidth: CGFloat = 2.0
lazy var subButton: AddButton! = {
print("frame height: \(self.frame.height)")
print("bounds height: \(self.bounds.height)")
let width = self.frame.width * 0.087
let size = CGSize(width: width, height: width)
let frame = CGRect(origin: CGPoint(x: self.frame.width * 0.055,
y: self.frame.height * 0.5), size: size)
let button = AddButton(frame: frame, isAddButton: false)
return button
}()
lazy var addButton: AddButton! = {
let width = self.frame.width * 0.087
let size = CGSize(width: width, height: width)
let frame = CGRect(origin: CGPoint(x: self.frame.width * 0.857,
y: self.frame.height), size: size)
let button = AddButton(frame: frame, isAddButton: true)
return button
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.setupUI()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setupUI()
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
print("rect height: \(rect.height)")
print("boundsheight: \(bounds.height)")
let context = UIGraphicsGetCurrentContext()
CGContextSetLineWidth(context, strokeWidth)
strokeColor.setStroke()
let topBarPath = UIBezierPath()
topBarPath.moveToPoint(CGPoint(x: 0.0, y: 2.0))
topBarPath.addLineToPoint(CGPoint(x: rect.width, y: 2.0))
topBarPath.lineWidth = strokeWidth
topBarPath.stroke()
let bottomBarPath = UIBezierPath()
bottomBarPath.moveToPoint(CGPoint(x: 0.0, y: rect.height-2.0))
bottomBarPath.addLineToPoint(CGPoint(x: rect.width, y: rect.height-2.0))
bottomBarPath.lineWidth = strokeWidth
bottomBarPath.stroke()
}
// MARK: Setup
func setupUI() {
self.backgroundColor = UIColor.yellowColor()
addSubview(subButton)
addSubview(addButton)
}
}
Edit:
ich die GroupingMetaDataView aus den Viewcontroller erstellen. YardageMetaDataView ist eine Unterklasse von GroupingMetaDataView. Die YardageMetaDataView führt keine benutzerdefinierten Zeichnungen aus.
bemerkte ich die Dokumentation für den drawRect Parameter besagt, dass
Der Anteil der Grenzen der Ansicht, die aktualisiert werden muss. Die erste Zeit, die Ihre Ansicht gezeichnet wird, ist dieses Rechteck normalerweise die gesamten sichtbaren Grenzen Ihrer Ansicht. Während der nachfolgenden Zeichenoperationen kann das Rechteck jedoch nur einen Teil Ihrer Ansicht angeben.
Wann und warum würde der Parameter rect nur einen Teil der Ansicht angeben? Der drawRect wird beim nächsten Zeichenzyklus aufgerufen, nachdem setNeedsDisplay ausgelöst wurde. SetNeedsDisplay nimmt keine Parameter an, also nehme ich an, dass der Parameter die gesamte Ansicht darstellt?
ViewController.swift
class ViewController: UIViewController {
// MARK: - Properties
lazy var yMetaDataView: YardageMetaDataView! = {
let view = YardageMetaDataView(frame: CGRect(origin: CGPoint(x: 50, y: 100),
size: CGSize(width: self.view.bounds.width * 0.75,
height: self.view.bounds.height * 0.102)))
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
}
Wo ist der Code, wo Sie es zu einer übergeordneten Ansicht hinzufügen? – nhgrif
@nhgrif Ich habe gerade die Codes hinzugefügt, die die Ansicht instanziiert. – gofly