Malen unter Cocoa

  • Malen unter Cocoa

    Hallo,

    ich bin absolut blutigster Anfänger in Cocoa, habe aber schon sehr viel Erfahrung mit Java. Jetzt möchte ich die komplette Oberfläche einer Bestehenden Java Anwendung in ObjectiveC/Cocoa neu schreiben. Dazu brauche ich auch abgeleitete Komponenten. Inzwischen habe ich in der recht verworrenen Dokumentation von Apple herausgefunden, dass ich dafür NSControl und NSCell (oder eine der Subklassen) erweitern muss.

    Was ich nirgendwo gefunden habe: Wie zeichne ich etwas in diese Komponente???? Ich weiss zwar, dass ich die drawInRect: drawInternal blablabla überschreiben kann, aber WIE zeichne ich bspweise einen Kreis, oder eine Linie, sprich alles was man in Swing/Java über die Methoden des Graphics Objektes tun würde? Muss ich dafür Quartz verwenden und kann man Quartz auch mit ObjektiveC ansprechen (denn bisher habe ich nur Beispiele gefunden, die mit C arbeiten)? Alles sehr verwirrend...

    Im Prinzip brauche ich eine Komponente in meiner Anwendung, die so ähnlich wie ein Kalendereintrag in iCal in der Wochenansicht aussieht...

    Vielen Dank für eure Hilfe.

    Gruß

    41isnr1
  • RE: Malen unter Cocoa

    Leider gibt es bei Cocoa keine vernüftige Dokumentation wie bei Java.

    Am besten legst du dir ein Buch über Cocoa zu. So kannst du am besten anfangen, Cocoa zu lernen.

    Ich bin auch ein Java Programmierer ... drawInRect bewirkt wie die paint Methode.
    Um ein Kreis zu zeichnen musst du folgendes machen:

    1. Rechteck definieren (pos x, pos y, width, height)

    Quellcode

    1. NSRect aRect = NSMakeRect(0.0, 0.0, 50.0, 50.0);


    2. Kreispfad anlegen

    Quellcode

    1. NSBezierPath * kreis = [NSBezierPath bezierPathWithOvalInRect:aRect];


    3. zeichnen

    Quellcode

    1. [kreis fill];


    alles liegt in der Methode drawInRect einer Subklasse von NSView.

    PS. Vor dem Zeichnen kannst du Farbe festlegen (siehe NSColor und die set Methode)
    Aus macfreakz wurde Apfelbeisser …
  • RE: Malen unter Cocoa

    Genau! Diese Erfahrung habe ich gesammelt.

    Als ich zum ersten Mal mit Cocoa angefangen habe, habe ich was ausprobiert und so weiter. Dann musste ich feststellen, dass die Beherrschung der Programmiersprache C auch eine Voraussetzung ist.

    Dann habe ich mir bisschen C aus Büchern studiert (allerwichtigste ist die Speicherverwaltung!!!) . Und anschließend hat man Erfolg mit Cocoa!!!
    Aus macfreakz wurde Apfelbeisser …
  • Erstmal vielen Dank für die schnellen Antworten!!! (Das ist ja hier wie bei macuser.de ;))

    Ich weiss, dass ich das Java Wissen nicht 1:1 anwenden kann, aber zumindest kenne ich damit die OOP Grundlagen und es sollte mir nicht allzu schwer fallen ObjectiveC zu lernen. Was anscheinend schwieriger ist, ist das beherrschen des Cocoa Frameworks.

    Was halten ihr beiden von dem Buch "Cocoa Programming for MacOS X" von Hillegass? Geht das auch tief genug oder ist das nur eine Einführung?

    Ciao

    41isnr1
  • Ich habe dieses Buch und bin immer noch begeistert über sein Schreibstil.
    Ein "Must-Have" für jedermann, der mit Cocoa beschäftigen will.

    Dabei ist auch sehr zu empfehlen, dass du dir auch C anschaust (was Struct, Pointer, Referenz, CString sind, musst du wissen ... ) ansonsten kommt alles vom "Learning by doing"

    Viel Glück!
    Aus macfreakz wurde Apfelbeisser …
  • noch was @macfreakz: die von dir genannte Doku hab ich schon mal überflogen, aber anscheinend dabei komplett übersehen, was ich eigentlich gesucht habe :). Ich habe einfach nicht in einem BezierPath eine Möglichkeit vermutet um einen Kreis zu zeichnen...

    Wahrscheinlich gehe ich zu offensiv an das Thema ran. Vielleicht sollte ich erst mal die Grundlagen studieren...

    Einsicht ist der erste Schritt zur Besserung ;)

    Ciao

    41isnr1
  • Als erstes mal das Hillegass Buch ist als Einstieg wirklich ein Must-have. Ob es weit genug in die Tiefe geht? Für mich nicht, meistens will ich Sachen machen die mit den std-Controls nicht gehen, dann wird bei dem Buch schnell sehr mau (Wie auch bei allen anderen die ich kenne, ich beschränke mich hier nicht auf Cocoa). Dann hilft nur noch Apple-Doku (sehr schwere Kost). Warum macht es Apple einem immer so schwer? Ein paar Beispiele mehr ein paar nette erklärende Bilder und schon würde sich das alles viel besser reinziehen.
    Beim zeichen mit Cocoa kommst du schnell an die Grenzen, dann ist Quarz eingesagt. Was ich davon halten soll weis ich auch nicht. Alle sprechen davon wie schnell und toll Quarz ist und wie einfach anzuwenden. Das finde ich nicht. Ich finde es befremdlich meine Zeicheneigenschaften in eine State zu setzten. Der sich dann auf alles auswirkt was man von da aus macht. Aber um alles in der Welt frage ich mich immer, wer die Shading-Klassen verbrochen hat. Das geht ja mit GDI+ besser und schneller und vor allem verständlicher.

    Aber eine meine größten Problem war immer, dass es keine RoundedRect gab, bis ich mir eine schöne Cathegorie zu NSBezierpath geschrieben hatte :) den Round Rects Are Everywhere!
    :D
  • Original von WoSoft
    habe mal eine kleine App geschrieben zum Freihandmalen in einem View und daneben ei Panel. in dem sich die Farbe und die Linienstärke einstellen lässt. Ist das ein Tutorial wert?


    Genau so ein Tutorial gibt es schon seit längerem auf Englisch unter Cocoa Dev Central: Drawing Scribbles. Sehr lesenswert, wie die meisten Cococa Dev Central Tutorials.

    t.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Original von ai-freak
    Mich würde vorallem echt interessieren, wann es nur noch mit den Quartz-Bibliotheken geht,


    Um eine erschöpfende Übersicht zu erhalten, müßtest Du wohl oder übel schon selber das AppKit Framework mit CoreGraphics vergleichen. Auf Anhieb fällt mir da jetzt spontan nur der umpfangreichere PDF Teil ein und vernünftiges Zeichnen von Farbverläufen mittels CGShading.

    oder was man da viel schneller machen kann.


    Insgesamt ist CG schneller als Cocoa, da u.a. natürlich der ObjC und OO Overhead wegfällt. Um wieviel, und ob das den Aufwand lohnt, hängt vom Einzelfall ab. Mir sind da jetzt keine vergleichenden Messungen bekannt.

    t.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • und Faktor 50 - 100 was den Entwicklungsaufwand angeht...

    eigentlich nicht. Man muss sich natürlich einarbeiten und dann schauen, was man braucht. Quartz ist doch Recht umständlich, wenn man keine einfache Anwendung will. Sonst muss man ATSUI nehmen, das aber auch nur auf Quartz (CoreGraphics) basiert.

    Hier mal ein Beispiel. Cocoa:

    Quellcode

    1. NSMutableDictionary *attrs;
    2. attrs = [NSMutableDictionary dictionary];
    3. [attrs setObject:[NSFont systemFontOfSize: 11] forKey:NSFontAttributeName];
    4. [attrs setObject:[NSColor blackColor] forKey:NSForegroundColorAttributeName];
    5. [string drawInRect:rect withAttributes:attrs];

    CoreGraphics:

    Quellcode

    1. CGContextRef context;
    2. ATSFontRef fontRef;
    3. fontRef = ATSFontFindFromName((CFStringRef)@"Lucida Grande", kATSOptionFlagsDefault);
    4. CGContextSetFont(context, CGFontCreateWithPlatformFont((void *)&fontRef));
    5. CGContextSetFontSize(context, 0.8);
    6. CGContextSetRGBFillColor(context, 1, 1, 1, 1);
    7. CGContextShowTextAtPoint(context, point.x, point.y, [string cString], [string length]);

    Das ist jetzt zwar stark vereinfacht und funktioniert in bestimmten fällen nicht, aber vom Prinzip her erledigt es das selbe und schneller ist es obendrein.

    Ich hatte vor einer Weile mal ein Example gemacht, wo auch die obere Funktion versagt. Ich hab's mal angehängt. Es ist nicht nur quick & dirty es ist dreckig, aber es gibt einem eine idee von verschiedenen Methoden. Wegen dem Versagen: bewegt mal die texte (mit den Pfeiltasten) nach oben, dann sollte es klar werden...

    Max
  • @MAX

    das ist ja alles sehr schön, was Du da sagst... Der Code ist auch sehr einfach, überschaubar, straight forward, wohl bekannt... macht keine Probleme so etwas Grundlegendes zu implementieren...

    nur, wenn es um ein umfangreicheres Layoutsystem geht, dann wird es in CG/ ATSUI schnell _sehr_ aufwändig. Z. B. wenn man folgendes noch haben will: Unicode Unterstützung, Mehrer Fonts und Fontattribute im Text, Editierbarkeit/ Veränderbarkeit des Textes, Copy and Paste, Scrolling etc. Da schreibt man sich die Finger wund und dusselig in Xcode, nur um das zu erreichen, was es in Cocoa umsonst gibt. Ein eventuell zu erhoffender Geschwindigeitsvorteil wird für Texte von ansehnlich durchschnittlichem Umfang kaum diesen Aufwand lohnen.

    Pace, natürlich wird es für den einen oder andren gute Gründe geben, sowas trotzdem von Hand machen zu wollen/ od. müssen...

    t.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?