Невозможно добавить тень к UIImage в UITableViewCell - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть UITableViewCell, который рисует изображение в drawContentView: Я хотел бы добавить тень к нему, поэтому я использую CALayers:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    AsyncCell *cell = (AsyncCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[AsyncCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSDictionary* obj = [facebookPhotosData objectAtIndex:indexPath.row];
    [cell updateCellInfo:obj];

    CALayer *sublayer = [CALayer layer];
    sublayer.contents = (id)cell.image.CGImage;
    sublayer.shadowOffset = CGSizeMake(0, 3);
    sublayer.shadowRadius = 5.0;
    sublayer.shadowColor = [UIColor blackColor].CGColor;
    sublayer.shadowOpacity = 0.8;
    sublayer.frame = CGRectMake(5.0, 5.0, cell.image.size.width, cell.image.size.height);
    [cell.layer addSublayer:sublayer];

    return cell;
}

вот мой метод drawContentView, если я добавлюздесь подслои, они продолжают складываться:

- (void) drawContentView:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [[UIColor whiteColor] set];
    CGContextFillRect(context, rect);

    NSString* caption = [NSString stringWithFormat:@"%@",[info objectForKey:@"caption"]];
    NSString* text = [info stringForKey:@"text"];

    CGFloat widthr = self.frame.size.width - 70;

    [[UIColor grayColor] set];
    [text drawInRect:CGRectMake(63.0, 25.0, widthr, 20.0) withFont:system14 lineBreakMode:UILineBreakModeTailTruncation];

    if (self.image) {
        UIImage *imageToDisplay;
        imageToDisplay = self.image;
        imageToDisplay = [self imageWithImage:imageToDisplay scaledToSize:CGSizeMake(imageToDisplay.size.width / 1.5, imageToDisplay.size.height / 1.5)];
        CGFloat width;
        CGFloat height;
        CGRect r;
        if (imageToDisplay.size.width < 310 && imageToDisplay.size.height > 290) {
            imageToDisplay = [self imageByCropping:imageToDisplay toRect:CGRectMake(0, 20, imageToDisplay.size.width, 250)];

        }
        else if (imageToDisplay.size.width > 310 && imageToDisplay.size.height < 20) {
            imageToDisplay = [self imageByCropping:imageToDisplay toRect:CGRectMake(30, 0, 290, 250)];
        }
        else {
            imageToDisplay = [self imageByCropping:imageToDisplay toRect:CGRectMake(30, 0, 290, 250)];

        }

        width = imageToDisplay.size.width;
        height = imageToDisplay.size.height;
        r = CGRectMake(5.0, 5.0, width, height);

        [imageToDisplay drawInRect:r];

        CALayer *sublayer = [CALayer layer];
        sublayer.contents = (id)imageToDisplay.CGImage;
        sublayer.shadowOffset = CGSizeMake(0, 3);
        sublayer.shadowRadius = 5.0;
        sublayer.shadowColor = [UIColor blackColor].CGColor;
        sublayer.shadowOpacity = 0.8;
        sublayer.frame = CGRectMake(5.0, 5.0, imageToDisplay.size.width, imageToDisplay.size.height);
        [self.layer addSublayer:sublayer];


        //Experimental shadow stuff with images
        /*CALayer *layer = [CALayer layer];
        layer = [CALayer layer];
        layer.bounds = CGRectMake(5.0, 5.0, imageToDisplay.size.width, imageToDisplay.size.height);
        layer.position = CGPointMake(150, 140);
        layer.contents = (id)imageToDisplay.CGImage;    

        layer.shadowOffset = CGSizeMake(0, 2);
        layer.shadowOpacity = 0.70;

        [self.layer addSublayer:layer];

        [self bezierPathWithCurvedShadowForRect:layer.bounds];*/

        [[UIColor blackColor] set];
        [caption drawInRect:CGRectMake(0, 270 , 298, 20.0) withFont:system14 lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
    }
}

Когда я помещаю код в этот метод делегата, ничего не происходит.Если я добавляю его в drawContentView, он рисует тень, но продолжает добавлять слои при прокрутке, что неверно.Не знаете, как я могу добавить тень к своим изображениям?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2011

О, теперь я вижу, что происходит.Попробуйте переместить весь ваш код из drawContentView: to drawRect: метод.Это должно решить проблему, потому что метод drawRect вызывается только когда установлен флаг setNeedsDisplay, а не каждый раз, когда пользователь выполняет прокрутку.

0 голосов
/ 26 декабря 2011

Из предоставленного описания мне не совсем понятно, что есть в методе drawContentView и когда он вызывается, но причина, по которой код, который вы дали, "продолжает добавлять слои при прокрутке", заключается в том, что он действительно добавляет ваш подслой ячейка каждый раз tableView: cellForRowAtIndexPath: вызывается (и это происходит очень часто при прокрутке)

Итак, первое очевидное исправление заключается в следующем:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

     AsyncCell *cell = (AsyncCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[AsyncCell alloc] initWithStyle:UITableViewCellStyleDefault                 reuseIdentifier:CellIdentifier];
        CALayer *sublayer = [CALayer layer];
        sublayer.contents = (id)cell.image.CGImage;
        sublayer.shadowOffset = CGSizeMake(0, 3);
        sublayer.shadowRadius = 5.0;
        sublayer.shadowColor = [UIColor blackColor].CGColor;
        sublayer.shadowOpacity = 0.8;
        sublayer.frame = CGRectMake(5.0, 5.0, cell.image.size.width, cell.image.size.height);
        [cell.layer addSublayer:sublayer];
    }

    NSDictionary* obj = [facebookPhotosData objectAtIndex:indexPath.row];
    [cell updateCellInfo:obj];

    return cell;
}

Таким образом, вам нужно нарисовать тень только один раз, вероятно, при создании ячейки. Лично я предпочел бы иметь этот кусок кода в классе AsyncCell. Надеюсь, это поможет.

...