Anfängerfehler: NSView in Subklasse von NSView einfügen.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Das ist klar, aber warum ist es so ?

    Das Problem konnte ich nun lösen. Der fertige Code lautet:

    Quellcode

    1. -(void)awakeFromNib{
    2. NSTextView* myTextView = [[NSTextView alloc]initWithFrame:[self bounds]];
    3. [myTextView setAutoresizingMask:NSViewHeightSizable| NSViewWidthSizable];
    4. [myTextView setVerticallyResizable:NO];
    5. [self addSubview:myTextView];
    6. }

    Damit passt es perfekt in den View rein.

    Wenn ich NSTextView* myTextView = [[NSTextView alloc]init] aufrufe und anschließend den Frame über [myTextView setFrame: [self bounds]] setze, erscheint es ebenfalls zu klein. Warum ist das so ? Es ist meiner Meinung nach der gleich Vorgang nur aufgeteilt: Initialisieren und Frame setzen.

    Gruß,
    Ingo
  • Ingo44 schrieb:

    Das ist klar, aber warum ist es so ?

    Das Problem konnte ich nun lösen. Der fertige Code lautet:

    Quellcode

    1. -(void)awakeFromNib{
    2. NSTextView* myTextView = [[NSTextView alloc]initWithFrame:[self bounds]];
    3. [myTextView setAutoresizingMask:NSViewHeightSizable| NSViewWidthSizable];
    4. [myTextView setVerticallyResizable:NO];
    5. [self addSubview:myTextView];
    6. }
    Damit passt es perfekt in den View rein.

    Wenn ich NSTextView* myTextView = [[NSTextView alloc]init] aufrufe und anschließend den Frame über [myTextView setFrame: [self bounds]] setze, erscheint es ebenfalls zu klein. Warum ist das so ? Es ist meiner Meinung nach der gleich Vorgang nur aufgeteilt: Initialisieren und Frame setzen.

    Gruß,
    Ingo
    developer.apple.com/library/io…MultipleInitializers.html
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Super ! Das verstehe ich zunehmend. Wie kann ich eigentlich das NSTextView, das ich in awakeFromNib erstellt habe in anderen Methoden ändern ?
    Zum Beispiel möchte ich den Frame des NSTextViews ändern, wenn der Benutzer auf einen Button klickt.

    Dann implementiere ich die Methode -(IBAction)changeFrame:(id)sender, jedoch kann ich dem NSTextView nicht direkt mitteilen, sich zu verändern.
    Wie funktioniert so etwas allgemein ?

    Danke für die gute Unterstützung !

    Viele Grüße,
    Ingo
  • Danke ! Das werde ich gleich mal ausprobieren. Wenn ich in diesem Projekt weiterspiele und einen NSSplitView als gesamtes View einfüge und in den unteren Teil einen NSView einfüge dessen Constraints nach oben/unten/ links/rechts 0 sind, dann erscheint es zwar, jedoch nur als kleines Rechteck in der unteren linken Ecke.

    Hat NSSplitView Besonderheiten oder stehe ich hier auf dem Schlauch und finde meinen Fehler nicht ?

    Gruß,
    Ingo
  • Daran lag es ! :) Die Constraints waren falsch gesetzt. Ich habe es eingestellt und es erscheint an der gewünschten Position.

    Wenn ich jedoch die Breite eines A4 Blattes haben möchte und die Width des Constrains als 595 points setze, erscheint es kleiner als A4.
    Woran kann den das nun wieder liegen ?( :)

    Gruß,
    Ingo
  • Genau, es soll unabhängig von der Bildschirmauflösung immer das A4 Format erscheinen. Egal ob im iMac mit 5K oder MacBook Air. Ich dachte, dass OSX immer mit Punkten rechnet und es somit egal ist, wie die Bildschirmauflösung eingestellt ist.

    Wie kann man den das abhängig von der Bildschirmauflösung programmieren ? Also, dass dass Programm zuerst die Auflösung ermittelt und es dann in Bezug auf die Weite setzt, sodass immer die konstante Länge erscheint ?
  • Du willst also dass wenn du ein A4-blatt an den bildschirm hälts, dass es dann gleich groß ist wie deine darstellung?

    wie gesagt hängt das von den dpi bzw ppi ab. Jeweils bei FullHD hat ein 24" display 92 dpi und ein 27"er eben nur noch 82 ppi.

    wenn du das umrechnen willst, müsstest du eben die ppi auslesen. du kannst dir mit der funktion CGDisplayScreenSize die größe in mm holen (nicht bei allen displays wird die funktion korrekte werte liefern) und dann die ppi errechnen.

    willst du jedoch nur die druck- oder pdf-ausgabe als auf A4 größe haben, so musst interessiert dich di ppi nicht.
  • Teilweise ja: Es geht darum, dass der Benutzer das NSTextView verkleinern und vergrößern kann (ähnlich wie bei Word). Wenn dass NSTextView kleiner als ein A4 Blatt dargestellt wird, so finde ich es etwas schwierig sich vorzustellen wie es im ausgedruckten Zustand aussieht. Deshalb überlege ich entweder das NSTextView in A4 Größe darzustellen, oder eine Zoom-Funktion einzubauen, die es erlaubt das NSTextView auf A4 Größe (und größer) zu vergrößern. Sobald auf A4 Größe gezoomt wurde, sollte vielleicht eine Nachricht erscheinen, dass es jetzt "Originalgröße" ist.

    Das NSTextView (bzw. das View, welches NSTextView ausfüllt) habe ich für diese Zwecke in ein NSScrollView eingefügt, damit man scrollen kann, falls es größer als der Bildschirm ist.

    Btw: Wie kann ich dem NSTextView mitteilen, dass man nicht außerhalb dessen schreiben kann ?

    Gruß,
    Ingo
  • Ich hatte in meiner App auch die Entscheidung zu treffen, was eine 100% Anzeige ist. Viele Applikationen im ähnlichen Umfeld setzen das mit der realen Größe gleich und bieten dazu eine Kalibrierungs-Funktion an. Ich entschied mich, unter 100% eine Anzeiges des kompletten Kontextes zu verstehen (wäre hier vielleicht eine Seite), unabhängig von der Bildschirmauflösung, Fenstergrösse etc.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Genau diese 100 % möchte ich als reale Größe (hier A4 Blatt) gleichsetzen. Ich habe mich nun entscheiden einen NSTextView in einen NSScrollView zu packen und entsprechend eine Zoom-Funktion zu implementieren. Bei 100 % sollte das die Meldung "Reale Größe erreicht" erscheinen.

    Nach etwas rumbasteln habe ich auch ein NSScrollView erstellt (im Interface Builder) und es als Subklasse meiner NSScrollView Klasse deklariert. Die Constraints habe ich gesetzt, sodass das NSScrollView das gesamte View ausfüllt. Das funktioniert prima. Nun schreibe ich folgenden Code und das NSTextView erscheint nicht mittig ;(

    Quellcode

    1. -(void)awakeFromNib{
    2. ourViewForScrollView* mainView = [[ourViewForScrollView alloc]initWithFrame:[self bounds]]; //View mit blauem Hintergrund
    3. [mainView setAutoresizingMask: NSViewHeightSizable | NSViewWidthSizable];
    4. CGFloat xPosition = (self.bounds.size.width -595)/2;
    5. CGFloat yPosition = 0;
    6. NSTextView* ourTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(xPosition, yPosition, 595, 842)];
    7. [ourTextView setVerticallyResizable:NO];
    8. [ourTextView setEditable:YES];
    9. [mainView addSubview:ourTextView];
    10. [self setDocumentView:mainView];
    11. }
    Alles anzeigen

    Alternativ könnte ich ein NSView erstellen, es mittig im NSScrollView zentrieren, eine bestimmte Höhe und Weite festlegen (per Constraints) und dann mit NSTextView füllen, jedoch möchte ich die andere Methode, die Erstellung per Code, lernen.

    Was habe ich den nun wieder verbockt ?

    Ich danke für die Hilfe, die Unterstützung und die Tipps ! Hier lerne ich viel !

    Viele Grüße,
    Ingo
  • Ingo44 schrieb:

    Ich dachte, dass OSX immer mit Punkten rechnet und es somit egal ist, wie die Bildschirmauflösung eingestellt ist.
    Das tut OS X auch. Allerdings geht OS X immer noch davon aus, dass ein Bildschirm mit dem Skalierungsfaktor 1 eine Auflösung von 72dpi hat. Bei einem Skalierungsfaktor 2 entsprechend 144dpi. Diese Auflösungen haben die Displays aber nicht mehr. Deshalb musst du für eine exakte 1:1 Darstellung immer die reale Auflösung des Displays mit einrechnen. Und dazu kommt dann auch das der Anwender in den Systemeinstellungen auch noch unterschiedliche Skalierungen einstellen kann.
  • Das Versprechen ließ sich physikalische ohnehin nie einhalten, wenn man bedenkt, dass es Röhrenmonitore gab und heute auch noch Beamer. Außerdem kommt es für das Erkennen kleiner Strukturen weniger auf die Größe als auf die Auflösung an. Deshalb konnte man ja früher vergleichsweise winzige Zeitungsschrift besser lesen als das, was Computer grobschlächtig auf den Bildschirm brachten. Daher war es nur richtig, dass mit höherer Auflösung die physikalische Abbildung schrumpfte. Die Punkte waren eben immer nur eine virtuelle Einheit.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ich denke, ich werde mich mit den Bildschirmeinstellungen später beschäftigen. Zunächst sollte ich das Layout des NSTextViews bearbeiten, und zwar sodass das "Papier" in der Mitte ist und sich - wie bei Pages / Word - links und rechts von dem Hintergrund abhebt. Das kriege ich nicht hin :( . Das NSScrollView des NSTextViews soll das geramte Fenster umfassen, jedoch sollte das Papier horizontal in der Mitte sein.

    Kann mir jemand hierfür eine Hilfestellung geben ?

    Vielen Dank !

    Viele Grüße,
    Ingo
  • Ich habe mal ein separates Projekt erstellt. Dort habe ich ein ScrollView erstellt und die jeweiligen Seitenconstraints auf 0 gesetzt. Für das Subview des ClipViews das gleiche.
    Im SubView des ClipViews ist mein NSView. Das habe ich zu Demonstrationszwecken rot ausgemalt.

    Diesem habe ich das mitgeteilt sich im SuperView mittig zu positionieren (funktioniert), das Top des SuperView ist das Top des roten Demoviews (funktioniert), das SuperView.bottom soll kleiner oder gleich ourView.bottom sein. (Damit wird es gestreckt).

    So, jetzt setzte ich im ourView.m folgendes:

    Quellcode

    1. -(void)awakeFromNib{
    2. [self setFrameSize:NSMakeSize(200, 400)];
    3. }
    Und es funktioniert nicht ;(