2014-12-30 21 views
7

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:

  1. 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)
  2. 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.)

Odpowiedz

6

Komunikat o błędzie spowodowany był faktem, że relacja self.superview nie została utworzona w momencie dodawania ograniczenia.

Kolejny błąd wynika z tego, że dwa ograniczenia thc2 nie mogą zostać dodane do NSScrollView, muszą być dodane do jego superview.

Mimo że powyższe wyniki nadal nie dają pożądanego rezultatu, pozbywa się dwóch błędów, które powstały w czasie wykonywania.

1

Stanie się tak, jeśli spróbujesz dodać ograniczenia do widoków, które nie należą do hierarchii widoku. Ograniczenie automatycznego układu.

Aby rozwiązać ten problem, opracowałem programowo utworzone ograniczenie, które było przyczyną problemu. Następnie debugowałem do tego momentu i sprawdziłem, czy żaden z dwóch widoków w ramach ograniczenia nie był wartością zerową po dodaniu ograniczenia. Jednym z nich był. Naprawiłem to i błąd zniknął.