2017-05-16 5 views
0

das wird schwer zu erklären sein. Ich modifiziere den InfoBarStackView-Beispielcode von Apple. Das Problem, das mir begegnet, ist, dass es so aussieht, als ob eine der Unteransichten durch NSStackview in zwei geteilt und separat gerendert wird.NSStackView/NSScrollView - unterteilte NSStackview-Unteransicht?

In meinem Beispiel füge ich meiner Stapelansicht 4 Unteransichten hinzu, die jeweils genau die gleiche Größe (und den gleichen Code) haben. Dies wird dann in eine NSScrollView platziert. (Das Layout ist vertikal.)

Wenn die Anwendung ausgeführt wird, sehe ich die allerersten zwei Teilansichten. Wenn ich nach unten scrolle, beginnt die Seltsamkeit. Die nachfolgende Ansicht wird gerendert, wobei der untere Teil gerendert wird und dann der obere gerendert wird. Wenn die vertikale Größe 272 Pixel beträgt, wird der Boden als 256 Pixel gerendert, und der obere Teil ist der Rest (16). Scrollen bis zur letzten Ansicht verursacht das gleiche Problem.

Beigefügt sind einige Bildschirm packt zu veranschaulichen: NSViews in NSStackView upon startup..

NSViews in NSStackView are chopped into two..

Ich habe ein Beispielprojekt für Xcode 8. ich das Xcode 8 Projekt here gebucht haben, wenn jemand einen Blick nehmen möchten. Ich kann das anscheinend nicht herausfinden.

+0

Verstehen Sie, was 'dirtyRect' in' - (void) drawRect: (NSRect) dirtyRect' ist? – Willeke

Antwort

2

Beziehen Sie sich auf die zusätzlichen Begrenzungsrahmen, die die Schaltflächen "Label" und "Show" schneiden?

Wenn Sie Xcode anzeigen Debugger verwenden bei der Zersetzung der Ansichtshierarchie zu betrachten und den gezogenen Inhalts jeder Ansicht, werden Sie sehen, dass der zusätzliche Begrenzungsrahmen durch die GT_BorderedView s gezogen werden - das heißt, die unteren GT_BorderedView s Zeichnen jeweils zwei Bounding-Boxen.

GT_BorderedView ‚s Implementierung von -drawRect: berechnet und zieht die Begrenzungskästen auf der Grundlage der dirtyRect, die in übergeben wird. Wenn jedoch die documentation states, das schmutzige rect ist «ein Rechteck den Teil der Ansicht definieren, die neu gezeichnet werden muss» , nicht unbedingt die ganzen Grenzen der Ansicht. Ändern der Implementierung zum Berechnen und Zeichnen der Grenze basierend auf [self bounds] anstelle der Dirty-Rect-Ergebnisse in der erwarteten Darstellung.

+0

Danke! Sie sind genau richtig. Ich habe komplett übersehen, dass DirtyRect nicht die gesamte Sichtweise gezeichnet hat. '[self bounds]' löst das Problem. –

-1

Taylor genagelt es. Ich habe nicht gemerkt, dass drawRect nicht die ganze Ansicht wiedergegeben hat. Die Verwendung von [self bounds] anstelle von dirtyRect stellt sicher, dass das Zeichnen ordnungsgemäß ausgeführt wird.