Jaki jest „NSScroller” zorientowany na podstawy?

Szukam jakiegoś podstawowego, prostego przykładu pracy z parą NSScrollerów w NSScrollView z niestandardowym NSView.

Istnieją sporadyczne przykłady, w większości składające się z wymyślnych przykładów wykorzystujących programowo utworzone interfejsy lub oparte na założeniu, że deweloper pracuje z typowym ImageView lub TextView. Nawet przykład szkicu jest oparty na NSView, który używa ustawień strony w oknie dialogowym Drukuj dla granic i wszystko jest zarządzane przez Cocoa. Nie ma więc żadnej prawdziwej dyskusji ani przykładów, w jaki sposób wszystko to działałoby przy użyciu niestandardowego modelu (choć może to być częścią problemu, ponieważ na czym polega model?). Nawet własna dokumentacja Apple jest tu podejrzana.

Zasadniczo mam podkategorię NSView osadzoną w NSScrollView (zgodnie z przewodnikiem Scoll View Guide), że użytkownik może kliknąć w widoku, aby tworzyć, edytować i usuwać obiekty, podobnie jak program do ilustracji. Model to te obiekty, które są po prostu opakowaniami danych, które po prostu rejestrują swoją pozycję do drawRect: do użycia. Wysokość i szerokość są oparte na niestandardowych wartościach, które są w razie potrzeby tłumaczone na piksele.

Moim problemem jest to, że wszystkie znalezione przykłady są oparte na edytorze tekstu, przeglądarce obrazów lub używają standardowych rozmiarów dokumentów w oknie dialogowym Ustawienia strony. Ponieważ są to typowe typy dokumentów, Cocoa zasadniczo zarządza programistą, więc kod interakcji jest mniej lub bardziej ukryty (lub po prostu nie widzę tego, czym jest). Mój projekt nie pasuje do tych potrzeb i nie muszę drukować. Wrzucenie mojego modelu do właściwości documentView nie zadziałałoby.

Po prostu szukam prostego przykładu, jak zainicjalizować NSScrollers za pomocą niestandardowego, zorientowanego obiektowo Modelu (documentView), i obsłużyć przewijanie i aktualizację w oparciu o akcję użytkownika, na przykład gdy użytkownik przeciągnie odrobinę obiektów do lewy lub dolny lub okno zmienia rozmiar. Myślę, że zbliżam się do uzyskania tego wszystkiego razem, ale brakuje mi punktu, w którym kontrolki są dokumentowane.

(Nie ma to znaczenia w pytaniu Cocoa, ale kiedy zrobiłem to w REALbasic, po prostu obliczyłbym i zastosowałem MaxX, MaxY do maksymalnej wartości ScrollBar na podstawie akcji użytkownika, obserwowałem pozycję w pasku przewijania, gdy użytkownik kliknie, i rysuj w razie potrzeby. Wydaje się, że NSScrollers w kontekście NSScrollView nie są dla mnie tak oczywiste.)

Doceniam czas poświęcony przez wszystkich, ale aktualizuję z większą ilością informacji w nadziei na uzyskanie odpowiedzi, której mogę użyć. Przepraszam, ale nic z tego nie ma sensu, dokumenty Apple są tępe, ale może brakuje mi tutaj czegoś boleśnie oczywistego ...

Mam tablicę obiektów w podklasowanym NSDocument, które są posiadaczami danych, które mówią drawRect, co i gdzie rysować. To jestprosto z przykładu Szkicu. Przykładowy szkic używa rozmiarów dokumentu w oknie dialogowym Ustawienia strony dla rozmiaru, więc nie ma tu nic do pokazania. Cieszę się, że Cocoa obsługuje stan pasków przewijania, ale jak połączyć ScrollView, aby zobaczyć początkowy stan edytora przechowywany w NSDocument i aktualizacje tych obiektów i edytora? Czy obliczam własny NSRect i przekazuję go do NSScrollView? Gdzie i jak? Czy robię to w moim niestandardowym NSView, który został osadzony w NSScrollView lub moim NSDocument w init? NSScrollView nie jest tworzony programowo (nie ma łatwego sposobu na zrobienie tego), więc wszystko siedzi w Interface Builder czekającym na połączenie. Brakuje mi haczyka.

Być może w tym tygodniu noszę czapkę „Nie rozumiem”, ale to nie może być takie trudne. Aplikacje ilustracyjne, edytory MIDI i niezliczone inne podobne aplikacje niestandardowe robią to cały czas.

ROZWIĄZANE (głównie):

Myślę, że już to załatwiłem, choć prawdopodobnie nie jest to najlepsza implementacja.

Moja klasa dokumentów ma teraz właściwość NSRect DocumentRect, która sprawdza wszystkie jej obiekty i zwraca nowy NSRect na podstawie ich lokalizacji. Nazywam to w moich podklasowanych zdarzeniach myszy NSView za pomocą

<code>[self setFrame:[[self EditorDocument] DocumentRect]];
</code>

To aktualizuje rozmiar Widoku na podstawie interakcji użytkownika, a okno obsługuje teraz przewijanie tam, gdzie wcześniej nie było. W tym momencie zastanawiam się, jak rozwinąć ramkę podczas przeciągania, ale przynajmniej mam teraz podstawowe pojęcie, którego mi brakowało.

Podana odpowiedź wskazała mi kierunek, w którym musiałem się tutaj udać (documentView wymagający widoku, co przełożyło się na spojrzenie na klasę NSView), więc Peter otrzymuje kredyt. Dziękuję bardzo za pomoc.

questionAnswers(1)

yourAnswerToTheQuestion