Custom selectedBackgroundView исходящих в стиле UITableView сгруппированы - PullRequest
2 голосов
/ 10 января 2012

enter image description here После использования UITableView Style Grouped возникает проблема при использовании selectedBackgroundView с пользовательским цветом.

он рисует снаружи UITableViewCell.Можно ли их обрезать в привязке?

Ответы [ 3 ]

5 голосов
/ 10 января 2012

У меня были похожие проблемы, и я не нашел простого и легкого способа решения. Я создал категорию для UIImage и использовал несколько изображений для отлова всех случаев.

  • single_cell_bg.png - изображение со всеми закругленными углами
  • top_cell_bg - изображение с закругленными верхними углами
  • .....

не так элегантно, но работает

@interface UIImage (CellBacground)
- (UIImage *)backgroundCellViewforRow:(NSInteger)row totalRow:(NSInteger)total;
@end



#import "UIImage+CellBacground.h"

@implementation UIImage (CellBacground)

- (UIImage *)backgroundCellViewforRow:(NSInteger)row totalRow:(NSInteger)total {
    NSString *path = NULL;
    if (row == 0) {
        if(total == 1) {
            path = [[NSBundle mainBundle] pathForResource:@"single_cell_bg" ofType:@"png"];
        } else {
            path = [[NSBundle mainBundle] pathForResource:@"top_cell_bg" ofType:@"png"];
        }
    } else {
        if ((total - row) == 1) {
            path = [[NSBundle mainBundle] pathForResource:@"bottom_cell_bg" ofType:@"png"];
        } else {
            path = [[NSBundle mainBundle] pathForResource:@"middle_cell_bg" ofType:@"png"];
        }
    }
    UIImage *theImage = [[UIImage alloc] initWithContentsOfFile:path];
    UIEdgeInsets imInset = UIEdgeInsetsMake(10, 10, 10, 10);
    UIImage *strImage = [theImage resizableImageWithCapInsets:imInset];
    return strImage;
}
@end

вызов в табличном представлении: cellForRowAtIndexPath:

UIImage *backImage = [[UIImage alloc] init];
[backImage backgroundCellViewforRow:indexPath.row totalRow:[tableView numberOfRowsInSection:indexPath.section]];
UIImageView *backview = [[UIImageView alloc] initWithImage:backImage];
cell.selectedBackgroundView = backview;
2 голосов
/ 01 марта 2013

Вот реальное решение, которое не использует изображения и должно работать в любой ситуации.Это немного сложно из-за проблемы с tableView: willDisplayCell: forRowAtIndexPath: только для iPad (см. Комментарий).Кроме того, если вы знаете, как закруглять отдельные углы, все становится совершенно естественным

Контроллер должен округлять углы, потому что именно он знает, в каком положении находится ячейка (первая, последняя и т. Д.), И влияет на то, какие углы закруглены.Лучшее место для округления, по-видимому, находится в tableView: willDisplayCell: forRowAtIndexPath :.Ниже приведен пример подкласса UITableViewController:

#import "MainViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface CustomCell : UITableViewCell

@end

@implementation CustomCell

- (void)installSelectedBackgroundView {
    UIView *view = [[UIView alloc] initWithFrame:self.frame];
    view.backgroundColor = [UIColor redColor]; // choose a color or add a gradient, etc
    view.layer.borderWidth = 1; // optional border
    view.layer.borderColor = [[UIColor grayColor] CGColor];
    self.selectedBackgroundView = view;
}

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        [self installSelectedBackgroundView];
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    [self installSelectedBackgroundView];
}

@end

@implementation MainViewController

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    CustomCell *cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.textLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row];
    return cell;
}

+ (void)roundCorners:(UIRectCorner)corners forView:(UIView *)view {
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                                   byRoundingCorners:corners
                                                         cornerRadii:CGSizeMake(10.0, 10.0)];

    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = view.bounds;
    maskLayer.path = maskPath.CGPath;
    view.layer.mask = maskLayer;
}

+ (void)roundCornersForSelectedBackgroundViewForTableView:(UITableView *)tableView cell:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath {
    NSUInteger rows = [tableView numberOfRowsInSection:indexPath.section];
    if (rows == 1) {
        [[self class] roundCorners:UIRectCornerAllCorners forView:cell.selectedBackgroundView];
    } else if (indexPath.row == 0) {
        [[self class] roundCorners:UIRectCornerTopLeft | UIRectCornerTopRight forView:cell.selectedBackgroundView];
    } else if (indexPath.row == rows-1) {
        [[self class] roundCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight forView:cell.selectedBackgroundView];
    } else {
        [[self class] roundCorners:0 forView:cell.selectedBackgroundView];
    }
}

+ (void)deferredRoundCornersForSelectedBackgroundViewForTableView:(UITableView *)tableView cell:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath {
    int64_t delayInSeconds = 0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [[self class] roundCornersForSelectedBackgroundViewForTableView:tableView cell:cell indexPath:indexPath];
    });
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    // cell.selectedBackgroundView.frame is not sized correctly yet, so rounding the corners has to be deferred briefly
    [[self class] deferredRoundCornersForSelectedBackgroundViewForTableView:tableView cell:cell indexPath:indexPath];
}

@end
1 голос
/ 10 января 2012

UIView * myCellView = [[UIView alloc] initWithFrame: cell.frame];

myCellView.backgroundColor = [UIColor colorWithRed: 1 зеленый: 1 синий: 0,75 альфа: 1];

cell.selectedBackgroundView = myCellView;

[выпуск myCellView];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...