NSImageView: Bild wird nicht angezeigt

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

  • NSImageView: Bild wird nicht angezeigt

    Ich habe ein Problem mit folgendem Swift-Code:

    C-Quellcode

    1. @IBOutlet weak var window: NSWindow!
    2. let imageView = NSImageView()
    3. imageView.image = NSImage(byReferencingURL: IMAGE)
    4. window.contentView?.addSubview(imageView)

    Es gibt keine Compile- und Laufzeitfehler und das NSImage-Objekt scheint das Bild richtig geladen zu haben, aber es wird nicht im Fenster angezeigt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Busty ()

  • Also window ist nicht nil, ich kann es mit window.setIsVisible(true) anzeigen.
    IMAGE ist ein NSURL, sie ist korrekt.
    Wenn ich NSImage ausgebe, werden die korrekten Abmessungen das Bildes angezeigt.
    Und imageView wird mit dem NSImageView-Konstruktor initialisiert.
    => sollte doch alles passen, oder?

    Aber ein Autolayout und frame habe ich nicht verwendet - wie funktioniert das?
  • Ich weiss jetzt nicht ob dies mit Swift ok ist (warum sollte es?), aber einen NSImageView sollte man eigentlich mit initWithFrame: (Designated Initializer) initialisieren. Anderenfalls sollte der frame von dem erzeugten NSImageView {0,0,0,0} sein.

    Bei Verwendung von Auto Layout könnte man ggf. auf initWithFrame: verzichten, da die Größe des NSImageViews ja durch die Layout Contraints berechnet und gesetzt wird.

    In dem o.a. Source Code kann man jedoch nicht sehen, ob Du auch Layout Contraints für den NSImageView setzt. ;)
  • Nein, ich setzte keine Layout Constraints - ich habe nur obigen Code.
    Ich habe den NSImageView-Konstruktor jetzt mal auf let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 236, height: 193)) geändert - jetzt wird das Bild geladen!
    Es ist allerdings links unten. - Gibt es einen komfortablen Weg es zu zentrien, oder muss ich selbst rechnen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Busty ()

  • Es hängt halt davon ab, wie es aussehen soll. Alternativ könntest Du den NSImageView komplett im contentView platzieren.

    Dies würde dann in Objective-C und ohne Auto Layout z.B. so aussehen:

    Quellcode

    1. imageView.frame = window.contentView.bounds;
    2. imageView.autoresizingMask = NSViewWidthSizable + NSViewHeightSizable;

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • MCDan schrieb:

    Es hängt halt davon ab, wie es aussehen soll. Alternativ könntest Du den NSImageView komplett im contentView platzieren.

    Dies würde dann in Objective-C und ohne Auto Layout z.B. so aussehen:

    Quellcode

    1. imageView.frame = window.contentView.bounds;
    2. imageView.autoresizingMask = NSViewWidthSizable + NSViewHeightSizable;
    Wenn dann aber bitte so ;)

    Quellcode

    1. imageView.autoresizingMask = [.ViewWidthSizable, .ViewHeightSizable]
  • matz schrieb:

    MCDan schrieb:

    Es hängt halt davon ab, wie es aussehen soll. Alternativ könntest Du den NSImageView komplett im contentView platzieren.

    Dies würde dann in Objective-C und ohne Auto Layout z.B. so aussehen:

    Quellcode

    1. imageView.frame = window.contentView.bounds;
    2. imageView.autoresizingMask = NSViewWidthSizable + NSViewHeightSizable;
    Wenn dann aber bitte so ;)

    Quellcode

    1. imageView.autoresizingMask = [.ViewWidthSizable, .ViewHeightSizable]
    Die Syntax kannte ich in Objective-C noch nicht. Ich würde aber bei meiner Schreibweise bleiben. :P
  • MCDan schrieb:

    matz schrieb:

    MCDan schrieb:

    Es hängt halt davon ab, wie es aussehen soll. Alternativ könntest Du den NSImageView komplett im contentView platzieren.

    Dies würde dann in Objective-C und ohne Auto Layout z.B. so aussehen:

    Quellcode

    1. imageView.frame = window.contentView.bounds;
    2. imageView.autoresizingMask = NSViewWidthSizable + NSViewHeightSizable;
    Wenn dann aber bitte so ;)

    Quellcode

    1. imageView.autoresizingMask = [.ViewWidthSizable, .ViewHeightSizable]
    Die Syntax kannte ich in Objective-C noch nicht. Ich würde aber bei meiner Schreibweise bleiben. :P
    Hier geht es aber um Swift ;)
  • Ok, das hat schon mal funktioniert. :)
    Nun möchte ich darunter noch einen ProgressIndicator setzen. Um den zu zentrieren (nur horizontal) muss ich dann doch rechnen. Wie ermittle ich aber die Breite des Fensters? - Es gibt ja nur minSize und maxSize.
    Wie ist überhaupt das Koordinaten-System des Fensters? Das scheint anders zu sein, als unter Windows...
  • Wenn man es drauf hat, ist man im coding schneller, als es in einem Interface Designer zusammenzuklicken. Man muss natürlich erst lernen, wie es geht.
    Außerdem weiß ich nicht, wie ich die Steuerelemente im xib dann mit leben fülle. Müssen die Controls dafür nicht einen eindeutigen Namen aufweisen? - Wie vergebe ich den?
  • Busty schrieb:

    Wenn man es drauf hat, ist man im coding schneller, als es in einem Interface Designer zusammenzuklicken. Man muss natürlich erst lernen, wie es geht.
    Woher hast du denn diese Erkenntnis?

    Busty schrieb:

    Außerdem weiß ich nicht, wie ich die Steuerelemente im xib dann mit leben fülle.
    Das muss man auch erst lernen.

    Busty schrieb:

    Müssen die Controls dafür nicht einen eindeutigen Namen aufweisen?
    Du hast noch nie etwas mit dem Interface Builder gemacht, nicht wahr?

    Busty schrieb:

    Wie vergebe ich den?
    Was willst du mit den Namen denn machen?
    „Meine Komplikation hatte eine Komplikation.“
  • Busty schrieb:

    Müssen die Controls dafür nicht einen eindeutigen Namen aufweisen? - Wie vergebe ich den?
    Einen Namen benötigen die Controls nicht. Es gibt auch keine Stelle im Interface Builder wo man diesen zuweisen könnte. Alternativ könnte man den Controls einen eindeutigen tag geben. Dies bringt Dich aber nicht wirklich weiter.

    Was Du meinst ist sicherlich eine Referenz auf das jeweilige Control. Dies lässt sich über ein Outlet Property im ViewController realisieren. Siehe auch Concepts in Objective-C Programming - Outlets.

    UPDATE: Ups, sorry, es geht hier ja um Swift. Hier der Links zu The Swift Programming Language - Declaration Attributes Used by Interface Builder. ;)

    Wenn Du Auto Layout Contrains wirklich per Source Code erzeugen möchtest, dann wünsche ich Dir viel Spaß. Ich habe die Anleitung dazu jetzt mehrfach gelesen und nicht verstanden. Dies soll aber nichts heissen. :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • Busty schrieb:

    Wenn man es drauf hat, ist man im coding schneller, als es in einem Interface Designer zusammenzuklicken. Man muss natürlich erst lernen, wie es geht.
    Außerdem weiß ich nicht, wie ich die Steuerelemente im xib dann mit leben fülle. Müssen die Controls dafür nicht einen eindeutigen Namen aufweisen? - Wie vergebe ich den?
    Wie kommst du bloß auf sowas?
    Ich weiß wie mans im code macht und wie mans im Interfacebuilder macht und ich bin sehr viel schneller mit dem IB.
    Um die elemente anzusprechen verwendet man sogenannte outlets.
  • Busty schrieb:
    >> Wenn man es drauf hat, ist man im coding schneller, als es in einem Interface Designer zusammenzuklicken. Man muss natürlich erst lernen, wie es geht.
    [/quote]> Woher hast du denn diese Erkenntnis?
    Von der Programmierung mit Java. Am Anfang fand ich es auch blöd, dass der Interface-Editor aus Eclipse entfernt wurde. Aber wenn man konsequent Layouts verwendet, dann gehts im Code schneller. Und vor allem ist man damit flexibler. Aber auch bei Visual Basic finde ich die Arbeit mit dem Interface-Builder ein Graus.

    Busty schrieb:
    >> Außerdem weiß ich nicht, wie ich die Steuerelemente im xib dann mit leben fülle.
    [/quote]> Das muss man auch erst lernen.
    Klar

    Busty schrieb:
    Müssen die Controls dafür nicht einen eindeutigen Namen aufweisen?
    [/quote]Du hast noch nie etwas mit dem Interface Builder gemacht, nicht wahr?
    Jo

    Busty schrieb:
    Wie vergebe ich den?
    [/quote]Was willst du mit den Namen denn machen?
    Damit ich das jeweilige Steuerelement im Code dann verwenden kann. So funktioniert es zumindest bei Visual Basic.