2017-07-25 6 views
0

J'ai placé une instance de la classe personnalisée BigView qui est une sous-classe de NSView à l'intérieur d'un NSScrollView dans IB. La taille du contenu de mon BigView sera calculée lors de l'exécution. Quelles sont les meilleures pratiques pour définir la taille du contenu?Pourquoi ne pas remplacer `intrinsicContentSize` dans` NSView` pour `NSScrollView`?

Redéfinition intrinsicContentSize, comme suggéré dans le guide Ranch Big Nerd, ne pas semblent fonctionner - le cadre reste à sa taille d'origine:

class BigView: NSView { 
    ... 
    override var intrinsicContentSize: NSSize { // doesn't work?! 
     return NSSize(width: 10000, height: 10000) 
    } 
    ... 
} 

Réglage du cadre par programme (ou IB) fonctionne:

class BigView: NSView { 
    ... 
    override func awakeFromNib() { 
     ... 
     self.frame = NSRect(x: 0, y: 0, width: 10000, height: 10000) 
    } 
    ... 
}I 

ou du contrôleur:

class ViewController: NSViewController { 
    @IBOutlet weak var bigView: BigView! 
    ... 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     bigView.frame = NSRect(x: 0, y: 0, width: 1000, height: 1000) 
    } 
    ... 
} 

Cela peut aussi être effectué tout au long de la propriété documentView scrollview:

class ViewController: NSViewController { 
    @IBOutlet weak var scrollView: NSScrollView! 
    ... 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     scrollView.documentView?.frame = NSRect(x: 0, y: 0, 
               width: 1000, height: 1000) 
    } 
    ... 
} 

Je suppose que l'on pourrait aussi utiliser des contraintes aussi bien en forme automatique.

Ce qui ne surcharge pas intrinsicContentSize fonctionne?

+0

Vous avez exactement le même problème. J'ai trouvé la définition de translatesAutoresizingMaskIntoConstraints sur la vue interne à NO sur la vue dans le xib ou en remplaçant la méthode résout le problème. Mais maintenant, je reçois un avertissement à l'exécution sur les contraintes manquantes. – Matt

Répondre

3

Le problème est que lorsque translatesAutoresizingMaskIntoConstraints est activé dans les versions plus récentes d'AppKit, les contraintes par défaut sont définies sans tenir compte de la taille intrinsèque.

Pour résoudre ce problème, vous devez ajouter les contraintes manuellement. D'abord épingler la position de votre BigView en haut à gauche de la vue d'ensemble (devrait être le NSClipView). Ensuite, allez à l'inspecteur de taille, et dans le Contenu Compression Résistance Priorité section Taille intrinsèque à Placeholder. Cela donne à votre vue les contraintes dont elle a besoin et tout devrait fonctionner à l'exécution.