Wie Hintergrundbild in eigenem Mac-Programm anzeigen

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

  • Wie Hintergrundbild in eigenem Mac-Programm anzeigen

    Hallo, ich habe mir Xcode 4 heruntergeladen und wollte jetzt mal anfangen mich etwas damit zu beschäftigen.

    Kann mir bitte einer sagen wie ich in meinem Programm ein eigenes Hintergrundbild einbauen kann?
    Das Bild liegt bereits im Ordner Resources.

    Welche Komponente benötige ich dafür und wie lade ich das Bild letztendlich beim starten des Programms?

    Vielen Dank
  • Ja dieses ImageView habe ich auch gefunden, aber wie bekomme ich das Hintergrundbild gekachelt?
    Also auch wenn ich das Fenster vergrößere sollte es automatisch gekachelt und nicht verzerrt werden.
  • Übrigens, sobald ich dieses ImageView auf meine Form ziehe, kann ich das Programm nicht starten. Ich bekomme in der main.m folgenden fehler

    Quellcode

    1. int main(int argc, char *argv[])
    2. {
    3. return NSApplicationMain(argc, (const char **)argv); //Thread1: Programm received signal: "SIGABRT".
    4. }






    Fehlermeldung

    Quellcode

    1. 2011-03-17 07:30:38.011 Delphimanager[1292:903] An uncaught exception was raised
    2. 2011-03-17 07:30:38.013 Delphimanager[1292:903] *** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (IKImageView)
    3. 2011-03-17 07:30:38.014 Delphimanager[1292:903] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (IKImageView)'
    4. *** Call stack at first throw:
    5. (
    6. 0 CoreFoundation 0x00007fff828ad7b4 __exceptionPreprocess + 180
    7. 1 libobjc.A.dylib 0x00007fff8806d0f3 objc_exception_throw + 45
    8. 2 CoreFoundation 0x00007fff828ad5d7 +[NSException raise:format:arguments:] + 103
    9. 3 CoreFoundation 0x00007fff828ad564 +[NSException raise:format:] + 148
    10. 4 Foundation 0x00007fff82c10c9a _decodeObjectBinary + 2427
    11. 5 Foundation 0x00007fff82c11a19 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1229
    12. 6 Foundation 0x00007fff82c11f59 -[NSArray(NSArray) initWithCoder:] + 462
    13. 7 Foundation 0x00007fff82c10d13 _decodeObjectBinary + 2548
    14. 8 Foundation 0x00007fff82c1018d _decodeObject + 208
    15. 9 AppKit 0x00007fff85ac2fde -[NSView initWithCoder:] + 362
    16. 10 Foundation 0x00007fff82c10d13 _decodeObjectBinary + 2548
    17. 11 Foundation 0x00007fff82c1018d _decodeObject + 208
    18. 12 AppKit 0x00007fff85ad139f -[NSWindowTemplate initWithCoder:] + 3824
    19. 13 Foundation 0x00007fff82c10d13 _decodeObjectBinary + 2548
    20. 14 Foundation 0x00007fff82c11a19 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1229
    21. 15 Foundation 0x00007fff82c1145c -[NSSet(NSSet) initWithCoder:] + 447
    22. 16 Foundation 0x00007fff82c10d13 _decodeObjectBinary + 2548
    23. 17 Foundation 0x00007fff82c1018d _decodeObject + 208
    24. 18 AppKit 0x00007fff85a530aa -[NSIBObjectData initWithCoder:] + 1983
    25. 19 Foundation 0x00007fff82c10d13 _decodeObjectBinary + 2548
    26. 20 Foundation 0x00007fff82c1018d _decodeObject + 208
    27. 21 AppKit 0x00007fff85a527d9 loadNib + 146
    28. 22 AppKit 0x00007fff85a51d36 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 248
    29. 23 AppKit 0x00007fff85a51b6e +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 326
    30. 24 AppKit 0x00007fff85a4f0ef NSApplicationMain + 279
    31. 25 Delphimanager 0x0000000100001222 main + 34
    32. 26 Delphimanager 0x00000001000011f4 start + 52
    33. 27 ??? 0x0000000000000001 0x0 + 1
    34. )
    35. terminate called after throwing an instance of 'NSException'
    36. (gdb)
    Alles anzeigen
  • Ok danke, das mit dem NSImageView funktioniert so weit.
    Nur die Frage, wie ich das Bild nun kacheln kann bleibt.

    Ich kann den Rand entfernen aber wie ich es kacheln kann da finde ich einfach nichts zu.
  • Ich bin mal wieder nicht sicher, aber ich glaube Kacheln ist keine Option für ein ImageView. Also must du es entweder selber bauen (z.B. indem Du einfach programmatisch imageviews hinzufügst in der richtigen Größe an der richtigen Stelle) oder eventuell einfach ein Webview nimmst und ein kleines html script anzeigst welches das Image als Hintergrndbild darstellt. Nicht so sauber diese Lösung, aber für einen Anfänger eventuell einfacher.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Man kann das Bild nicht kacheln?
    Das wäre nicht so toll.

    Wie kann man denn programmseitig dieses ImageView kacheln lassen?
    Ich bin Anfänger und wollte mit etwas leichtem anfangen :(
    Aber das interessiert mich jetzt.

    Der Lösungsansatz mit dem WebView würde mich aber auch interessieren.
    In HTML, CSS bin ich fit. Nur wie rufe ich meine Seite in dem das Image liegt dann in meinem Programm auf?
  • profwebapps schrieb:

    Wie kann man denn programmseitig dieses ImageView kacheln lassen?
    Ich bin Anfänger und wollte mit etwas leichtem anfangen :(
    Aber das interessiert mich jetzt.

    Na das ist doch gleich mal eine schöne Übung, um eine eigene View-Klasse zu erstellen. Ich gebe Dir mal ein paar Anhaltspunkte, was zu tun ist.
    1. Neue Subklasse von NSView abgeleitet erstellen.
    2. Die Klasse braucht eine Property vom Typ NSImage, die Dein Bild speichert.
    3. Die Methode drawRect: überschreiben. Hier zeichnest Du dann das in der Property gespeicherte Bild gekachelt. Zum Beispiel mit der Methode drawAtPoint:fromRect:operation:fraction: von NSImage.
    4. Im Interface Builder platzierst Du nun ein CustomView und weist diesem Deine neue Klasse zu.

    Michael
  • Der Michael hat einen sehr schönen Ansatz gelifert. Die Idee finde ich viel besser als meine aber ich schreibe die Lösung trotzdem mal rein.

    Programmatisch würde das so gehen, das du dir die größe des Fensters (Views) holst und einfach durch deine Imagegröße teilst. Dann weißt Du wie viele ImageViews du brauchst. Dann erzeugst du in einer Schleife entsprechend viele Imageviews und plazierst sie dann.

    Also so ganz grob

    Quellcode

    1. for(int y=0;y<anzahlBilderVertikal;y++)
    2. {
    3. for(int x=0;x<anzahlBilderHorizontal;x++)
    4. {
    5. NSImageView *imageView=[[NSImageView alloc] initWithFrame:CGRectMake(x*BreiteDesBildes,y*HöheDesBildes,Breit,Höhe)];
    6. [imageView setImage:dasBild];
    7. [self.view AddSubbView:imageView];
    8. [imageView release], imageView=nil;
    9. }
    10. }


    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Vielen Dank euch beiden.
    So weit bin ich aber noch lang nicht.

    Thallius: Bei Deinem Beispiel habert es schon an den beiden Stellen


    Für dasBild wollte ich einfach @"Bild2" nehmen das in Resources liegt.
    Schient aber nicht zu funktionieren da ich folgende Fehlermeldung bekomme.
    warning: Semantic Issue: Incompatible pointer types sending 'NSString *' to parameter of type 'NSImage *'
    Außerdem bekomme ich bei der Zeile darunter diesen Fehler


    error: Semantic Issue: Property 'view' not found on object of type 'Test1AppDelegate *'




    Quellcode

    1. [imageView setImage:dasBild];
    2. [self.view AddSubbView:imageView];