2016-06-09 10 views
0

Ich habe eine UIImageView in einem Storyboard, in dem ich UIImagages aus einer von zwei Quellen speichern - ich entweder das Bild aus dem Netz oder aus dem lokalen Asset-Katalog laden. In allen Fällen sind die Bilder 48x48; Die Bildansicht ist zufällig 50x50. Mit Ausnahme des Codes, der das Bild abruft (entweder über Alamofire + AlamofireImage oder UIImage: benannt), ist der Rest des Codes identisch. Die Bilder, wenn geladen, sind, durch Prüfung in lldb, 48x48 für beide Quellen.UImage position shifting in UIImageView

Das Verhalten, das ich sehe, ist, dass die aus dem Netz geladenen Bilder richtig in der Bildansicht zentriert angezeigt werden. Diejenigen, die aus dem Asset-Katalog geladen werden, werden jedoch nach rechts verschoben und so verschoben, ungeachtet des Inhaltsmodus, den ich in der Bildansicht eingestellt habe (ich habe sie alle ausprobiert). Das gesamte lokale Bild wird so verschoben, dass die linke Kante nicht an der linken Kante der Bildansicht ausgerichtet ist - es befindet sich ungefähr in der Mitte. Als ein Experiment nahm ich eines der Netzbilder auf und speicherte es im Katalog; es wurde auch verschoben, wenn es angezeigt wird, was mich zu dem Schluss führt, dass das Problem nicht das Bild selbst ist.

Meine Frage ist: Was könnte in den beiden Fällen anders sein - zwischen 48x48 Bilder, die ich aus dem Netz geladen im Vergleich zu identischen Bildern aus dem Asset-Katalog geladen - das das lokal geladene Bild nach rechts verschoben?

Dies ist der Code aus dem Asset-Katalog zu laden:

image = UIImage(named: iconString) 

ich dies auch versucht:

image = UIImage(named: iconString)?.imageWithAlignmentRectInsets(UIEdgeInsetsMake(0, 0, 0, 9)) 

aber es machte keinen Unterschied.

Der Alamofire/AlamofireImage Code ist ebenso einfach:

let request = Alamofire.request(.GET, url) 
    .validate() 
    .responseImage { response in completion?(result: response.result.value) } 

und der Code schließlich das Bild in das UI zu stellen, die für beide Wege ist:

cell.imageView?.image = fcsts.first!.icon 

Das Experiment Ich habe die Datei erfasst und versuche es aus dem Asset-Katalog. Ich bin überzeugt, dass der Dateiinhalt nicht das Problem ist (obwohl ich bereit wäre, falsch angezeigt zu werden!) - etwas bewirkt, dass das lokal geladene Bild in der Ansicht versetzt wird .

Die Anwendung ist für iPhone. Ich teste auf dem neuesten Xcode/iOS; Die App ist in Swift.

+0

Gerne helfen, wenn Sie eine MCVE bereitstellen http://StackOverflow.com/Help/Mcve –

+0

Wie ist die UIImageView eingeschränkt in seinem Elternteil? –

+0

Die Bildansicht ist das am weitesten links liegende Element einer horizontalen Stapelansicht, die auf die gleiche Höhe und am linken Rand beschränkt ist.Ich kämpfe in meinem eigenen Kopf, um zu verstehen, wie etwas davon relevant sein kann - nicht, dass es keine gute Frage ist - weil die einzige Variable, die ich finden kann, ist, ob das Bild aus dem Netz kommt oder aus dem Asset-Katalog kommt . Der Versuch, die Datei aus dem Netzwerk zu speichern und sie im Asset-Katalog zu speichern, scheint dies zu bestätigen. Was MCVE betrifft, finde ich es schwierig, die Anwendung in kleiner Form testbar zu machen, werde es aber versuchen. – Feldur

Antwort

0

Das Problem stellt sich als eine Funktion des automatischen Layouts dar, das von der Tabellenansichtszelle ausgeführt wird, wie in here besprochen. Ich habe ausdrücklich das Symbol der Ansicht Größe in meinem Drehbuch gesetzt 50x50 zu sein, so dass diese Überschreibung in der Klasse Tabellenzelle das Problem für mich festgelegt:

override func layoutSubviews() { 
    super.layoutSubviews() 
    if let rect = self.imageView?.frame { 
     var newRect = rect 
     newRect.origin = CGPointMake((50-rect.size.width)/2, (50-rect.size.height)/2) 
     self.imageView!.frame = newRect 
    } 
} 

Ich habe keine Erklärung dafür, warum Kopieren des Bildes aus dem Netzwerk ein lokale Datei bewirkt, dass es der Neupositionierung unterliegt, und auch nicht, warum die fehlerhafte Positionierung nur in horizontaler Richtung erfolgt, obwohl alle beteiligten Größen symmetrisch sind. (Ja, es funktioniert, wenn ich nur die X-Position anpassen; auch Y ist nur Paranoia.)