Frage

Ich bin ein Neuling bei Cocoa und habe einige Zweifel an NSImage.

Frage 1:

Das Ändern des Grenzursprungs eines Bildes scheint keine Auswirkung zu haben.Ich habe erwartet, dass das Bild vom neu eingestellten Ursprung gezeichnet wird, aber das scheint nicht der Fall zu sein.Vermisse ich etwas?

code:

NSImage* carImage = [NSImage imageNamed:@"car"];

[self.imageView setImage:carImage];

//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);

Hinweis : imageView ist ein IBOutlet

Frage 2:

Ich habe versucht, ein Bild zuzuschneiden, aber es scheint das Bild nicht zuzuschneiden. Ich kann das gesamte Bild sehen.Was fehlt mir?

code:

NSRect sourceRect = CGRectMake(150, 25, 100, 50);
NSRect destRect = CGRectMake(0, 0, 100, 50);

NSImage* carImage = [NSImage imageNamed:@"car"];

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];

[self.imageView setImage:carImage];

Danke

War es hilfreich?

Lösung

Das Ändern des Grenzursprungs eines Bildes scheint keine Auswirkung zu haben. …

//Following line has no effect:
self.imageView.bounds = CGRectMake(self.imageView.bounds.origin.x + 100, self.imageView.bounds.origin.y, self.imageView.bounds.size.width,self.imageView.bounds.size.height);

Das ist eine Bildansicht, kein Bild.

Der Effekt des Änderns der Grenzen einer Ansicht hängt davon ab, was die Ansicht zum Zeichnen tut. Im Endeffekt bedeutet dies, dass Sie die Grenzen einer Ansicht, die keine Instanz einer von Ihnen erstellten Ansichtsklasse ist, nicht ändern sollten, da Sie nicht genau vorhersagen können, wie eine NSImageView ihr Bild zeichnen wird (vermutlich, da es sich um ein Steuerelement handelt) betrifft seine Zelle, aber mehr als das würde ich nicht verlassen).

Im Allgemeinen ist es ziemlich selten, den Ursprung der Grenzen einer Ansicht zu ändern. Ich erinnere mich nicht, es jemals getan zu haben, und ich kann mir keinen Grund vorstellen, es zu tun. Durch Ändern der Begrenzungsgröße wird skaliert und nicht zugeschnitten.

Ich habe versucht, ein Bild zuzuschneiden, aber es scheint das Bild nicht zuzuschneiden. Ich kann das gesamte Bild sehen. Was fehlt mir?

[carImage drawInRect:destRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0];

[self.imageView setImage:carImage];

Wenn Sie einem Bild sagen, dass es gezeichnet werden soll, ändert dies nichts am Bild. Das Bild wird nicht so zugeschnitten, dass das Bild danach kleiner oder größer wird. Sie sagen, es soll zeichnen, nichts weiter.

Folglich setzt die nachfolgende Anweisung das Bild der Bildansicht auf das gesamte Bild, genau so, als hätten Sie dem Bild nicht gesagt, dass es zeichnen soll, da es keinen Unterschied machte, wenn Sie es zum Zeichnen aufforderten.

Wenn Sie einem Bild sagen, dass es zeichnen soll, ist dies genau das: Es weist das Bild an, zu zeichnen. Dafür gibt es nur zwei richtige Stellen:

  1. Zwischen lockFocus- und unlockFocus-Nachrichten an eine Ansicht oder ein Bild (oder nach dem Festlegen des aktuellen NSGraphicsContext).
  2. Innerhalb der drawRect:-Methode einer Ansicht.

    Überall sonst sollten Sie keinem Cocoa-Objekt sagen, dass es zeichnen soll.

    Eine korrekte Möglichkeit, ein Bild zuzuschneiden, besteht darin, ein neues Bild mit der gewünschten / angepassten Größe zu erstellen, den Fokus darauf zu speichern, den gewünschten Teil des Originalbilds darin zu zeichnen und den Fokus auf das neue Bild zu entsperren. Sie haben dann sowohl die Original- als auch eine zugeschnittene Version.

    Eine andere richtige Möglichkeit wäre, eine eigene benutzerdefinierte Bildansicht mit zwei Eigenschaften zu erstellen: Eine besitzt ein zu zeichnendes Bild und die andere ein Rechteck. Wenn diese benutzerdefinierte Ansicht zum Zeichnen aufgefordert wird, weist sie das Bild an, das angegebene Rechteck in die Grenzen der Ansicht zu zeichnen. Sie würden dann immer das Originalbild halten und einfach nur den gewünschten Abschnitt zeichnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top