0

私のアプリでは、PSCollectionViewを使用して pinterest に似たビューを作成しています。今、クラスからセル クラスに、セルに設定した imageView の高さを挿入する値を渡そうとしています。アプリを実行すると、アプリはこの高さを正確に使用してセルを作成しますが、imageView には次元がありません。ここに私のコードを投稿します:

PSCollectionView コントローラー

- (CGFloat)collectionView:(PSCollectionView *)collectionView heightForRowAtIndex:(NSInteger)index {
    NSString *width = [self.arrayWithData[index] objectForKey:@"width"];
    NSString *height = [self.arrayWithData[index] objectForKey:@"height"];
    NSLog(@"%@ e %@", width, height);

    cellHeight = [self getHeightWith:width andHeight:height];

    return cellHeight;    
}

- (CGFloat)getHeightWith:(NSString *)originalWidth andHeight:(NSString *)originalHeight {
    float width = [originalWidth floatValue];
    float height = [originalHeight floatValue];
    float multiplier = height / width;
    // So che la mia cella ha una dimensione massima in larghezza di 100, da questo calcolo l'altezza
    return 100 * multiplier;
}

- (PSCollectionViewCell *)collectionView:(PSCollectionView *)collectionView cellForRowAtIndex:(NSInteger)index {
    ProductViewCell *cell = (ProductViewCell *)[self.psView dequeueReusableViewForClass:nil];
    if (!cell) {
        //cell = [[ProductViewCell alloc]initWithFrame:CGRectMake(10, 70, 100, 100)];
        //cell = [[ProductViewCell alloc] initWithFrame:CGRectMake(0,0,collectionView.frame.size.width/2,100)];
        cell = [[ProductViewCell alloc] initWithFrame:CGRectMake(0,0,collectionView.frame.size.width/2,cellHeight + 20)];
    }
    cell.imageHeight = cellHeight;
    cell.labelName.text = [[self.arrayWithData objectAtIndex:index]objectForKey:@"name"];
    NSURL * url = [NSURL URLWithString:[[self.arrayWithData objectAtIndex:index]objectForKey:@"url"]];

    [self loadImageFromWeb:url andImageView:cell.productImage];
    return cell;
}

- (void) loadImageFromWeb:(NSURL *)urlImg andImageView:(UIImageView *)imageView {
    //NSURLRequest* request = [NSURLRequest requestWithURL:url];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:urlImg];

    NSString *authCredentials =@"reply:reply";
    NSString *authValue = [NSString stringWithFormat:@"Basic %@",[authCredentials base64EncodedStringWithWrapWidth:0]];
    [request setValue:authValue forHTTPHeaderField:@"Authorization"];

    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse * response,
                                               NSData * data,
                                               NSError * error) {
                               if (!error){
                                   UIImage *image = [[UIImage alloc] initWithData:data];
                                   [imageView setImage:image];
                                   [HUD hide:YES];
                               } else {
                                   NSLog(@"ERRORE: %@", error);
                               }

                           }];
}

そしてこのコード:

ProductViewCell.h

#import "PSCollectionViewCell.h"

@interface ProductViewCell : PSCollectionViewCell {
    float wMargin;
}
@property(nonatomic,strong)UIImageView *productImage;
@property(nonatomic,strong)UILabel *labelName;
// I use this variable to pass the height of the cell from the class who implement PSCollectionView
@property CGFloat imageHeight;

+ (CGFloat)heightForViewWithObject:(id)object inColumnWidth:(CGFloat)cloumnWidth;
@end

ProductViewCell.m

#import "ProductViewCell.h"

#define MARGIN 8.0


@implementation ProductViewCell

- (id)initWithFrame:(CGRect)frame
{
    wMargin = 5.0;
    self = [super initWithFrame:frame];
    if (self) {
//        self.productImage = [[UIImageView alloc]initWithFrame:CGRectMake(wMargin, 5, frame.size.width - (wMargin * 2), 125)];
        self.productImage = [[UIImageView alloc]initWithFrame:CGRectMake(wMargin, 5, frame.size.width - (wMargin * 2), self.imageHeight)];
        self.labelName = [[UILabel alloc]initWithFrame:CGRectMake(wMargin, 130, frame.size.width - (wMargin * 2), 20)];
        self.labelName.font = [self.labelName.font fontWithSize:12];
        self.labelName.textAlignment = NSTextAlignmentCenter;

        [self addSubview:self.productImage];
        [self addSubview:self.labelName];

        self.backgroundColor = [UIColor colorWithRed:236.0f/255.0f green:236.0f/255.0f blue:236.0f/255.0f alpha:1.0];
        self.layer.masksToBounds = YES;
        self.layer.borderWidth = 1.0f;
        self.layer.cornerRadius = 10.0f;
        self.layer.borderColor= [[UIColor colorWithRed:207.0f/255.0f green:207.0f/255.0f blue:207.0f/255.0f alpha:1] CGColor];

        [self.productImage setContentMode:UIViewContentModeScaleAspectFit];
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/
@end

値をログに記録しようとするとself.imageHeight、コンソールに 0 が表示されますが、このデータをPSCollectionView controller. 計算したデータをセルに送信するにはどうすればよいですか? それを行う方法はありますか?

4

2 に答える 2

0

提供されたコードによると、ProductViewCell 実装のクラス プロパティ imageHeight は、新しいセルが初期化されるときにのみ使用されます。その時点で、imageHeight は設定も更新もされていないため、常に 0 になります。これは、imageHeight の値を更新するたびにセル プロパティが更新されることを意味しますが、セルはそれに対して何もしません。

これを実現するには、ProductViewCell の setImageHeight: メソッドを単純にオーバーライドして、何らかのアクションをトリガーできるようにします。

- (void)setImageHeight:(CGFloat)imageHeight {
    if (_imageHeight != imageHeight) {
        _imageHeight = imageHeight;
        // Do something useful with the new value e.g. calculations
    }
}

このメソッドは、セル プロパティを更新するたびに呼び出されます

cell.imageHeight = ...
于 2013-11-13T10:26:15.773 に答える