NS View anfänger Frage

  • Quellcode

    1. NSImage* tempIcon = [[NSImage alloc] initWithSize:NSMakeSize(21, 21)];
    2. [tempIcon lockFocus];
    3. [[NSColor colorWithDeviceRed:1.0 green:0.0 blue:0.0 alpha:1.0] set];
    4. [[NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 21, 21)] fill];
    5. [tempIcon unlockFocus];
    6. NSButton* tempButton = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 21, 21)];
    7. [tempButton setFrameOrigin:NSMakePoint(193, 755 - 61 - 21)];
    8. [tempButton setButtonType:NSMomentaryPushInButton];
    9. [tempButton setBezelStyle:NSShadowlessSquareBezelStyle];
    10. [tempButton setBordered:NO];
    11. [tempButton setImagePosition:NSImageOnly];
    12. [tempButton setImage:tempIcon];
    13. [self addSubview:tempButton];
    14. [tempIcon release];
    15. [tempButton release];
    Alles anzeigen
    Mußte ich erstmal suchen, wie die entsprechenden Funktionen heißen. Bei setButtonType bin ich mir ganz sicher und das sollte ja das korrekte Verhalten des Buttons steuern. setBezelStyle ist eher geraten. Wie auch immer. Noch passiert nichts mit diesem lustig roten Button.
  • Die Frage ist, was genau willst Du erreichen. Du bist genau in dem Minenfeld gelandet, das sich mit einfachem 'event-handling' vermeiden ließe: Wo liegt der 'button', welches Verhalten hat er etc.
    Dazu muss man immer im Auge behalten, dass jedes 'NSView' in der Hierarchie und das Fenster sich natürlich auch irgendwie verhält.
    An sich sieht der Code korrekt aus, aber ohne die bestimmte Klasse und das 'nib' zu kennen, hat das nichts zu bedeuten.
    I would be embarrassed if they did not spy on me.
  • Ich kann ja noch ein paar mehr Details zum Layout meines Projektes offenbahren. Das CustomView (abgeleitet von NSView) nimmt die gesamte Fenstergröße ein. Es ist über ein Outlet mit der Hauptklasse verbunden. Der zuvor gepostete Code befindet sich in der CustomView.m-Datei (die natürlich anders heißt) und zwar in der Methode drawRect.

    Die Buttons werden 1a erzeugt und über addSubView dem CustomView hinzugefügt. Kann es vielleicht sein, daß ich sie nicht alle so temporär erzeugen darf? Also das es sich in der Struktur eventuell nur um eine Button-Instanz handelt, statt um eine x-beliebige Zahl (soviele Werte, wie eben visualisiert werden sollen)? Klicke ich ein bißchen auf den Buttons herum, wird das Programm arg langsam. Irgendetwas scheint also zu arbeiten.
  • Klicke ich ein bißchen auf den Buttons herum, wird das Programm arg langsam. Irgendetwas scheint also zu arbeiten.

    Das ist ja kein Wunder, du erzeugst ja haufenweise neue Views, drawRect wird ja i.d.R. ziemlich häufig aufgerufen und jedes mal werden es mehr Buttons...
  • Original von m99
    Der zuvor gepostete Code befindet sich in der CustomView.m-Datei (die natürlich anders heißt) und zwar in der Methode drawRect.

    Ähm, ich schrieb bereits in meiner Antwort auf Deinen ersten Beitrag in diesem Thread (22.11.2007 10:36), dass die drawRect: Methode nur für den ihr zugedachten Zweck genutzt werden sollte. Was passiert hat omz ja schon gesagt. Die Viewhierarchie ändert man sinnvollerweise nicht innerhalb eines Views und schon mal gar nicht während ein View sich gerade selbst zeichnet.

    Michael
  • In welcher Funktion von NSView müßte ich denn die Buttons erzeugen? Ich weiß… sicher 'ne doofe Frage, aber eine Frage, die einer Antwort bedarf ;)

    initWithFrame vielleicht? Die klingt ganz danach.

    Das war dann doch nicht ganz die Lösung, denn beim Initialisieren lagen meine zu visualisierenden Werte noch nicht vor. Also hab ich mir eine Funktion gebastelt, die die Buttons erzeugt und die erst dann aufgerufen wird, wenn die Daten vorliegen.

    Marco
  • Ich benutze parallel gerade drawInRect als NSString Additional Function, um ein Font-Sample in einem Rechteck fester Größe anzuzeigen. Dabei soll es möglich sein, daß der Benutzer die Schriftgröße des Samples und auch den Buchstaben an sich ändert. Es sieht so aus, als ob drawInRect ein automatisches Clipping macht. Ich hätte nur gern, daß der Buchstabe horizontal und vertikal zentriert im angegebenen Rechteck liegt. Gibt es eine Übersicht über die möglichen Attribute der drawInRect-Funktion?

    Mir ist außerdem gerade noch aufgefallen, daß ich zwar die Buttons (als Subklasse von NSView) super hinzufügen kann, aber keine NSStrings für die Font-Samples. Wo ist da der richtige Weg? Wie gesagt: die FontSamples werden mit drawInRect erzeugt. Ich habe also am Ende zehn NSString-Instanzen, die ich gern dem CustomView hinzufügen würde, damit sie angezeigt werden. Irgendwelche Ideen?

    Marco
  • Bevor Du ins Blaue weiter schreibst, solltest Du Dich um MVC kümmern. Man kann vieles in einem 'NSView' hinein programmieren, aber oft gehört es dort nicht hin.
    Also ein 'Controller' oder meinetwegen auch 'Manager' bemüht sich um Deine speziellen 'CustomView' mit dem so geheimen Namen, dann erstellt das Objekt die Knöpfe und bastelt alles zusammen, bzw. liefert Deinem 'CustomView' die Elemente die es zum Zeichnen braucht.

    Text: Du erfragst das Rechteck, dass das Textsystem für die Zeichenkette zum Zeichnen braucht und setzt es in den Rahmen zum Zeichnen ein. Das musst Du so, wie Du es vorhast, von Hand machen.

    Und natürlich wird 'clipping' unterstützt.
    I would be embarrassed if they did not spy on me.