2016-08-21 1 views
0

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 
    }() 
} 
+0

Où est le code dans lequel vous l'ajoutez à une vue parente? – nhgrif

+0

@nhgrif Je viens d'ajouter les codes qui instancient la vue. – gofly

Répondre

0

Il existe une autre méthode similaire à setNeedsDisplay appelé setNeedsDisplay (_ :). Lorsque ce dernier est appelé, le paramètre est passé à drawRect (_ :) est celui que vous avez passé dans cet appel. Cette zone rectangulaire est marquée comme invalide et doit être redessinée. Je ne sais pas si vous avez appelé setNeedsDisplay (_ :) ou non. C'est votre travail de découvrir. Bonne chance. :)