2016-08-29 6 views
0

angewandt habe ich UIView Vorfahren - lassen MyView sagen, welche Methode -drawInRect überschreibt ein Bild umEntfernen Qualität zu verlieren, nachdem Skala

override func draw(_ rect: CGRect) { 
    super.draw(rect) 

    image?.draw(in: rect) 

    /*some code here*/ 
} 

Diese Ansicht an einem gewissen Punkt in beiden Richtungen skaliert angezeigt werden soll. Nach der Vergrößerung verliert das angezeigte Bild seine Qualität. Wenn ich MyView mit der Größe 20 * 20 erstelle, bleibt die Eigenschaft bounds nach der Skalierung gleich, aber das transformierte Bild, das ich anzeigen möchte, ist von geringer Qualität, weil ich versuche, es mit der gleichen Größe von 20x20 zu malen. Gibt es eine Möglichkeit, ein Bild jeweils auf meine Ansichtskalierung zu zeichnen?

+0

Ich skaliere MyView superview, nicht die Ansicht selbst. –

Antwort

0

Erstens, stark in Betracht ziehen, eine UIImageView als Subview zu verwenden, anstatt zu versuchen, selbst bescheidene komplizierte Bildzeichnung selbst zu implementieren. UIImageView ist für viele der Probleme optimiert, denen Sie begegnen können. Es ist nicht perfekt, und manchmal ist es möglich, mit der Hand besser zu werden, wenn Sie wissen, was Sie tun, aber es macht seine Arbeit gut.

Zu Ihrem spezifischen Problem, contentMode ist fast sicher scaleToFill (das ist die Standardeinstellung). Die einfachste Lösung besteht darin, sie in redraw zu ändern, um ein vollständiges Neuzeichnen zu erzwingen, wenn sich die Grenzen ändern. Das ist nicht sehr effizient, aber möglicherweise für Ihr Problem in Ordnung (es ist oft in Ordnung). Es ist sehr viel komplizierter und macht oft sehr viel spezielles Wissen, wie sich Ihre App verhält. Für die einfachen Fälle, die diese hohe Qualität und Leistungsfähigkeit bilden, ist das, was UIImageView für Sie tut.

Wenn Sie sicher sind von 20x20 zu einer anderen bestimmten Größe skaliert, und Sie haben nicht zu viele Ansichten haben, ist ein weiterer Trick bei Ihrer vollen Größe zu zeichnen und dann nach unten bis 20x20 skalieren. Dies ist sehr ineffizient, wenn Sie eine Menge Ansichten haben und die Größe der endgültigen Bilder ist groß, aber kann sehr schnell und von hoher Qualität sein, so ist zumindest etwas zu berücksichtigen. Ich habe das gemacht, um mit kleinen Zooms zu arbeiten (zum Beispiel zu 110% Größe). Es wäre wahrscheinlich keine gute Möglichkeit, Thumbnails in Vollbild-Bilder zu verwandeln.

+0

UIImageView ist nicht für mich geeignet, weil ich zu einem gewissen Zeitpunkt dunkle Überlagerung zu nicht transparenten Pixeln über blendMode + fillColor in drawInRect hinzufügen. Lösung mit ContentMode wird nicht funktionieren, weil, wie gesagt, Grenzen nicht ändern. nur transformieren Skalierung ist aktuelle Lösung, aber es scheint nicht die effizienteste sein. –

Verwandte Themen