Je suis en train d'apprendre comment créer des UIViews personnalisés. Cette vue spécifique que je fais contient quelques boutons. J'ai remarqué quand j'appelle la propriété frame/height du bloc d'instanciation paresseux, j'obtiens la valeur 128, mais quand j'appelle la propriété height sur l'argument rect passé dans la fonction drawRect avec les limites, j'obtiens la valeur 94.Les limites UIView/cadre ne correspondent pas avec drawRect
Je ne comprends pas pourquoi les propriétés bounds/frame width/height appelées par la fonction drawRect ne s'alignent pas sur la hauteur et la largeur des trames/limites utilisées dans l'initialiseur. Quelqu'un peut-il expliquer cela?
@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:
je crée le GroupingMetaDataView du ViewController. YardageMetaDataView est une sous-classe de GroupingMetaDataView. YardageMetaDataView n'effectue aucun dessin personnalisé.
Je la documentation a remarqué le paramètre drawRect indique que
La partie des limites de la vue qui doit être mis à jour. La première fois que votre vue est dessinée, ce rectangle correspond généralement à l'ensemble des limites visibles de votre vue. Toutefois, lors des opérations suivantes de dessin , le rectangle peut spécifier seulement une partie de votre vue.
Quand et pourquoi le paramètre, rect, ne spécifierait qu'une partie de la vue? Le drawRect est appelé lors du cycle de dessin suivant, après le déclenchement de setNeedsDisplay. SetNeedsDisplay ne prend aucun paramètre, donc je suppose que le paramètre représente la vue entière?
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
}()
}
Où est le code dans lequel vous l'ajoutez à une vue parente? – nhgrif
@nhgrif Je viens d'ajouter les codes qui instancient la vue. – gofly