2010-06-28 21 views
10

Ich versuche, verschiedene Größe Bilder in Imageview von UITableViewCell zu platzieren. Ich bekomme die Bilddaten asynchron, erstelle das Image, setze den Content-Modus von imageView und setze schließlich die Grenzen von imageView. Aber der Code scheint unempfindlich gegenüber Änderungen zu sein, die ich vorgenommen habe. Ich möchte, dass die Bilder in einem 75x75-Bereich zentriert sind. Ich schrieb den folgenden Code für diesen ZweckÄndern Grenzen der Imageview von UITableViewCell

UIImage* image = [UIImage imageWithData:data]; 
[holder.imageView setContentMode:UIViewContentModeCenter || UIViewContentModeRedraw]; 
[holder.imageView setImage:image]; 
[holder.imageView setBounds:CGRectMake(0,0,75,75)]; 
[holder.imageView setFrame:CGRectMake(0,0,75,75)]; 
[holder setNeedsLayout]; 

Wo Halter ist die UITableViewCell. Das Ergebnis ist immer dasselbe. Alle Bilder haben 75px Höhe und unterschiedliche Breiten. Kann mir jemand helfen, dieses Problem zu lösen?

Ich habe erkannt, dass contentMode Einstellung und begrenze Eigenschaften keine Auswirkungen in diesem Code hat. Ich habe ein NSLog nach der letzten Zeile hinzugefügt und bekam die Ergebnisse wie folgt:

NSLog(@"imageview:%@ bounds and contentMode:%@ %@",[holder imageView],[holder.imageView bounds],[holder.imageView contentMode]); 

Imageview: < UIImageView: 0x39ab8a0; Rahmen = (0 0; 75 75); undurchsichtig = NEIN; userInteractionEnabled = NEIN; layer = < CALayer: 0x39a92b0 >> Grenzen und contentMode: (null) (null)

Immer noch keine Lösung

Antwort

42

gemacht, ich fand schließlich die Lösung, es kostete mich 3 Stunden obwohl =)

die Lösung ist Eigenschaften wie gebunden, Rahmen zu ändern, contentMode in - (void) layoutSubviews mich thod der benutzerdefinierten UITableViewCell-Klasse. Der "Trick" ist, in dieser Methode Layout-Code zu schreiben, sonst hat der Code keine Wirkung.

Im Folgenden Code habe für mich die Arbeit. Dadurch werden Zeilen der Tabelle vertikal ausgerichtet.

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    self.imageView.bounds = CGRectMake(0,0,75,75); 
    self.imageView.frame = CGRectMake(0,0,75,75); 
    self.imageView.contentMode = UIViewContentModeScaleAspectFit; 

    CGRect tmpFrame = self.textLabel.frame; 
    tmpFrame.origin.x = 77; 
    self.textLabel.frame = tmpFrame; 

    tmpFrame = self.detailTextLabel.frame; 
    tmpFrame.origin.x = 77; 
    self.detailTextLabel.frame = tmpFrame; 

} 
+0

Bummer, ich dachte, ich könnte gezwungen sein, eine andere UITableViewCell-Unterklasse zu erstellen ... danke, dass du mir die Zeit genommen hast, es zu bestätigen! –

+1

Ich muss zustimmen, dass dies eine enorme Zeitverschwendung ist, um dies wie erwartet zu funktionieren. –

+0

Während das funktioniert, ist es immer noch ein Hack. Man würde erwarten, dass der Frame/die Grenzen aus den Einschränkungen heraus berechnet werden, die in der benutzerdefinierten UITableViewCell festgelegt sind. –

1

versuchen, die "contentMode" Eigentum von Imageview zu 'UIViewContentModeScaleAspectFit' oder 'UIViewContentModeScaleAspectFill' Wechsel

+1

Danke, ich habe Ihre Empfehlung versucht, aber es hat nicht funktioniert. Ich habe festgestellt, dass der Wert, den ich auf contentMode und bounds gesetzt habe, keinen Effekt hat. Ich habe meinen ersten Beitrag bearbeitet, um dies zu reflektieren. –

2

"UIViewContentModeCenter || UIViewContentModeRedraw" ist äquivalent zu 1. Es ist auch kein bitfield. Sie möchten UIViewContentModeCenter.

UITableViewCell.imageView wird von der Zelle verwaltet. Wenn Sie benutzerdefinierte Layout möchten, versuchen Sie einen Blick auf content Hinzufügen (ich nehme an, was Sie unter „in einem 75x75-Bereich zentriert“ bedeuten):

UIImageView * iv = [[[UIImageView alloc] initWithImage:image] autorelease]; 
iv.frame = (CGRect){{0,0},{75,75}}; 
iv.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin| UIViewAutoresizingFlexibleRightMargin; 
iv.contentMode = UIViewContentModeScaleAspectFit; 
[holder.contentView addSubview:iv]; 
+0

Danke! Ich habe das Problem gelöst, ohne die Inhaltsansicht zu verwenden. Ich werde die Frage als nach 2 Tagen beantwortet markieren =) –

10

Also das Problem mit UITableViewCell ‚s ist, dass Sie keine Kontrolle über die Größe der integrierten Objekte (nämlich Imageview, content, accessoryView, backgroundView). Wenn sich die Tabelle ändert, werden Ihre Anpassungen mit Füßen getreten.

Sie können, wie Behlul betonte, die Größen korrigieren, indem Sie layoutSubviews verwenden, aber das Problem dabei ist, dass layoutSubviews jedes Mal aufgerufen wird, wenn die Tabelle scrollt. Das sind viele unnötige Re-Layout-Aufrufe.

Eine alternative Methode ist der Einsatz alle Ihrer Inhalte an den content hinzuzufügen.Ähnlich können Sie, wenn Sie den Hintergrund anpassen, ein transparentes backgroundView erstellen und Ihre benutzerdefinierte Hintergrundansicht (z. B. myBackgroundView) als Unteransicht von backgroundView hinzufügen.

Auf diese Weise können Sie Ihre Artikel so platzieren und skalieren, wie Sie sie haben möchten.

Die untere Seite ist das Lager Nachrichten werden nicht mehr von den Zubehör- oder Bildansichten erhalten. Sie müssen nur Ihre eigenen erstellen.

Hoffe, dass hilft!

// This code is not tested 
// MyCustomTableViewCell 
- (id) init{ 
    self = [super initWithStyle: UITableViewCellStyleDefault reuseIdentifier:@"MyReuseIdentifier"]; 
    if(self){ 
     //image view 
     my_image_view = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"default_image.png"]] retain]; 
     [my_image_view setFrame:CGRectMake(10,10,30,30)]; 
     [self.contentView addSubview:my_image_view]; 

     //labels 
     my_text_label = [[[UILabel alloc] initWithFrame:CGRectMake(50,10,100,15)] retain]; 
     [self.contentView addSubview:my_text_label]; 
     //set font, etc 

     //detail label 
     my_detail_label = [[[UILabel alloc] initWithFrame:CGRectMake(50,25,100,15)] retain]; 
     [self.contentView addSubview:my_detail_label]; 
     //set font, etc 

     //accessory view 
     //Whatever you want to do here 
     //attach "accessoryButtonTapped" selector to button action 

     //background view 
     UIView* background_view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)] autorelease]; 
     [background_view setBackgroundColor:[UIColor greenColor]]; 
     background_view.layer.cornerRadius = 17; 
     background_view.layer.borderWidth = 3; 
     background_view.layer.borderColor = [UIColor whiteColor].CGColor; 

     [self setBackgroundView:[[[UIView alloc] init] autorelease]]; 
     [self.backgroundView addSubview:background_view]; 
    } 

    return self; 
} 

- (void) setLabelText: (NSString*) label_text{ 
    [my_text_label setText:label_text]; 
} 

- (void) setDetailText: (NSString*) detail_text{ 
    [my_detail_label setText: detail_text]; 
} 

- (void) accessoryButtonTapped{ 
    //call table view delegate's accessoryButtonTappedForRowWithIndexPath method 
} 
+0

Dies ist eigentlich die bessere Methode als die ausgewählte Antwort. Sie können auch eine UITableViewCell über eine Xib erstellen, wenn Sie möchten. Hier ist ein Tutorial: http://ijoshsmith.com/2011/07/16/creating-a-custom-uitableviewcell-in-ios-4/ –

+0

Dies hat den Trick für mich getan. –

0

erstellen Unterklasse von UITableViewCell:

@interface UITableViewCellSubClass : UITableViewCell 

@end 

@implementation UITableViewCellSubClass 

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    self.imageView.frame = CGRectMake(0,4,32,32); 
    self.textLabel.frame = CGRectMake(42,4,300,32); 
} 
@end 
Verwandte Themen