Mam kilka widoków, które muszę współpracować z niestandardową podklasą NSScrollView robię. Jeden typ widoku musi zostać poprawiony całkowicie w stosunku do przewijania w NSScrollView, a inny typ musi mieć zewnętrzną powłokę ustaloną na miejscu względem przewijania, ale umożliwiać przewijanie zawartości wewnętrznej w miarę zmian przewijania (jak nagłówki kolumn w arkuszu kalkulacyjnym na przykład).Gdzie dodać subViews, które chcę unosić w NSScrollView przy użyciu AutoLayout?
są następujące opcje dla umieszczania tych poglądów w hierarchii widoku AFAIK:
- podrzędny z NSScrollView (największy sens, ale pojawia się następujący błąd:
*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: A multiplier of 0 or a nil second item together with a location for the first attribute creates an illegal constraint of a location equal to a constant. Location attributes must be specified in pairs)
- podrzędny superview NSScrollView (wydaje się, że działa lepiej, ale nie czuje się dobrze z perspektywy projektowej, ponieważ chcę, aby moje widoki były częścią scrollView)
===
Mam również czytać w więcej niż jednym miejscu online, które nie będą mogły korzystać z podejścia Visual Format Language
do konfigurowania moich ograniczeń, ponieważ pływające ograniczenia nie są ustawione w stosunku do natychmiastowego SuperView. Jest to wskazówka, że robię coś niewłaściwie powyżej, ponieważ drugie podejście może korzystać z VCL, podczas gdy pierwsze wymagałoby ręcznego utworzenia NSLayoutConstraint.
===
Poniżej znajduje się kod Swift że dodałem do initialiser mojego NSScrollView podklasy:
topCorner = NSButton()
topCorner.translatesAutoresizingMaskIntoConstraints = false
topCorner.bezelStyle = NSBezelStyle.CircularBezelStyle //.RecessedBezelStyle
topCorner.setButtonType(NSButtonType.PushOnPushOffButton)
topCorner.identifier = "topCorner"
topCorner.title = "TC"
self.addSubview(topCorner)
thc = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.superview, attribute: NSLayoutAttribute.Left, multiplier: 1.0, constant: 0.0)
self.addConstraint(thc)
thc1 = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 36.0)
self.addConstraint(thc1)
thc2 = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.superview, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0.0)
self.addConstraint(thc2)
thc3 = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 24.0)
self.addConstraint(thc3)
Żeby dodatkowo dezorientować rzeczy, pojawi się komunikat o błędzie, który pojawia się tylko kiedy mam ograniczenia thc i thc2 w kodzie. (Eksperymentowano z komentowaniem różnych wiązań, aby zobaczyć, co było przyczyną strasznego tekstu błędu.)