2017-10-28 5 views
0

In einer App gebaut Ich habe Trans UITableViewCell, ich den folgenden Code ein Bild auf der linken Seite jeder Zelle zeigt eine Tabellenansicht hatte innerhalb von cellForRowAtIndexPath durch Ausführen von:Breaks in iOS 11

cell.imageView.image = [UIImage imageNamed:myImage];

Aber das Bild war zu groß, so dass ich es geschrumpft:

cell.imageView.transform = CGAffineTransformMakeScale(0.3, 0.3);

das in iOS ganz gut gearbeitet 10. Aber sobald ich auf die neueste Xcode mit dem SDK 11 iOS aktualisiert, die Bilder bekam enorm. Es stellt sich heraus, dass diese zweite Codezeile, die die Bildansicht transformiert, jetzt nichts bewirkt: Ich kann es auskommentieren, die 0.3 in etwas anderes ändern usw., und es macht keinen Unterschied. CGAffineTransformMakeScale hat immer noch Dokumentation im neuen Xcode, also gehe ich davon aus, dass es nicht veraltet war, aber warum hat es dann mit iOS 11 gebrochen und wie behebe ich es? Irgendwelche Ideen? Danke im Voraus! Bitte beachten Sie, dass ich Objective-C verwende.

Edit:

versucht nur 3 Änderungen am Code:

  1. Ändern Sie die zweite Zeile cell.imageView.transform = CGAffineTransformMakeScale(0.0000001, 0.0000001);. Nichts passiert (d. H. Die Bildansichten und die Bilder in ihnen sind immer noch genauso groß).

  2. Ändern Sie die zweite Zeile in cell.imageView.transform = CGAffineTransformMakeScale(0, 0);. Das Bild verschwindet aus der Bildansicht, aber die Bildansicht hat immer noch die gleiche Größe. Sie können erkennen, dass der Bildtext immer noch den Text in der Zelle verschiebt und weit nach rechts verschiebt.

  3. Entfernen Sie die erste Codezeile (dem Bildansicht wird kein Bild mehr zugewiesen). Die Bildansicht verschwindet und der Text wird ganz nach links in die Zelle verschoben.

Vielleicht kann dies helfen, etwas Licht auf, was los ist?

+0

Teilen Sie das Bild –

+0

@SyedQamarAbbas, die Bildansicht ist dynamisch, und es gibt viele, viele Bilder, die links neben dem Titel der Tabellenzelle angezeigt werden können. Vor iOS 11 sind alle zusammen geschrumpft, und keiner von ihnen tut mehr. Es ist also nicht bildspezifisch. – Viktor

Antwort

0

eine Antwort auf meine eigene Frage gefunden, mit Kredit aufgrund Paul Antwort von dieser Frage: How to resize a cell.imageView in a TableView and apply tintColor in Swift

CGSize itemSize = CGSizeMake(50, 50); 
UIGraphicsBeginImageContextWithOptions(itemSize, false, 0); 
CGRect imageRect = CGRectMake(0, 0, itemSize.width, itemSize.height); 
[cell.imageView.image drawInRect:imageRect]; 
cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Ich weiß immer noch nicht, warum die alte CGAffineTransformMakeScale nicht mehr funktioniert, aber das erledigt den Job.

1

Also, wenn Sie versuchen, die Bildgröße justieren die imageView Sie tatsächlich passen contentMode Eigenschaft des Imageview ist wie so verwenden sollte:

cell.imageView.contentMode = UIViewContentModeScaleAspectFit; 

oder in Swift für andere

cell.imageView.contentMode = .scaleAspectFit 

Dies hält die Abmessungen des Bildes und passt das Bild der maximalen Größe auf die imageView, ohne die Abmessungen zu ändern

Sie könnten auch versuchen UIViewContentModeScaleAspectFit (oder .scaleAspectFill in Swift), die im Grunde die Abmessungen der imageView vollständig füllt, aber wenn das Bild größer oder größer als die Bildansicht ist, schneidet er, was nicht passt.

Hier sind alle contentModes direkt von einem Obj-C und Swift-Quelldateien:

typedef NS_ENUM(NSInteger, UIViewContentMode) { 
UIViewContentModeScaleToFill, 
UIViewContentModeScaleAspectFit,  // contents scaled to fit with fixed aspect. remainder is transparent 
UIViewContentModeScaleAspectFill,  // contents scaled to fill with fixed aspect. some portion of content may be clipped. 
UIViewContentModeRedraw,    // redraw on bounds change (calls -setNeedsDisplay) 
UIViewContentModeCenter,    // contents remain same size. positioned adjusted. 
UIViewContentModeTop, 
UIViewContentModeBottom, 
UIViewContentModeLeft, 
UIViewContentModeRight, 
UIViewContentModeTopLeft, 
UIViewContentModeTopRight, 
UIViewContentModeBottomLeft, 
UIViewContentModeBottomRight, 
}; 

public enum UIViewContentMode : Int { 
    case scaleToFill 
    case scaleAspectFit // contents scaled to fit with fixed aspect. remainder is transparent 
    case scaleAspectFill // contents scaled to fill with fixed aspect. some portion of content may be clipped. 
    case redraw // redraw on bounds change (calls -setNeedsDisplay) 
    case center // contents remain same size. positioned adjusted. 
    case top 
    case bottom 
    case left 
    case right 
    case topLeft 
    case topRight 
    case bottomLeft 
    case bottomRight 
} 

EDIT:

Da ich sehen Sie auch daran interessiert sind, die Abmessungen des imageView bei der Veränderung selbst ("um mehr Platz für den Text zu lassen"), was ich vorschlagen würde, ist eigentlich, entweder in Storyboard oder programmgesteuert mit AutoLayout, um Ihre eigenen imageView hinzuzufügen und Größe und platziert, wie Sie es wollen, anstatt die Standard imageView auf einer Zelle, die ist als ein bequemes/standardisiertes Werkzeug gemeint.

Wenn Sie nicht vertraut sind, würde ich nach einem AutoLayout-Tutorial suchen. Oder vielleicht "AutoLayout verwenden, um benutzerdefinierte UITableViewCell zu erstellen"

Wenn Sie nicht wirklich Ihre eigene Unterklasse erstellen möchten, können Sie versuchen, die `cell.imageView.frame = ..." irgendwo zu setzen, um es manuell zu ändern, was Sie wollen, dann sicher schön noch das Bild, um seinen Inhalt Modus Einstellung paßt

diese Frage. Siehe: How do I make UITableViewCell's ImageView a fixed size even when the image is smaller

+0

Ja, verwende einen der Werte "fill" oder "fit" oder einen der anderen und setze 'clipsToBounds' auf true. – danh

+0

Und der objektive c-Code ist 'cell.imageView.contentMode = UIViewContentModeScaleAspectFit;' – danh

+0

Danke für Ihre Antworten, @gadu und @danh. Was ich eigentlich versuche, ist, nicht nur das Bild in der Bildansicht zu verkleinern, sondern die gesamte Bildansicht, einschließlich des darin enthaltenen Bildes, zu verkleinern. Der Unterschied liegt darin, dass dadurch im Rest der Zelle mehr Platz für den Text bleibt. Der 'cell.imageView.transform = CGAffineTransformMakeScale (0.3, 0.3);' Code hat beides in iOS 10, tut aber auch nicht in iOS 11. – Viktor