Сгруппированный uitableview с тенью - PullRequest
4 голосов
/ 02 августа 2011

Есть идеи, как показать тень вокруг границы сгруппированного uitableview? (Вокруг всей границы сверху, снизу, по бокам, а также вокруг закругленных углов секций).

Мне нужен точно такой же эффект, как здесь на картинке:

alt http://img824.imageshack.us/img824/2826/tableviewwithshadow.png

Обратите внимание на небольшую тень возле границы (серая, синий - фон)

Ответы [ 3 ]

12 голосов
/ 03 января 2012

По моему мнению, я придумал довольно "хакерское" решение, так что я не совсем доволен им, но в любом случае!тем самым достигается базовая функциональность рисования тени вокруг группы ячеек в разделе.поэтому я создал подкласс UITableView и реализовал метод layoutSubviews следующим образом:

- (void) layoutSubviews {
    [super layoutSubviews];

    const CGFloat PageCellBackgroundRadius = 6.0;

    for(int i = 0; i < [self numberOfSections]; i++) {
        NSInteger viewTag = i + 123456;
        CGRect frameRect = [self shadowFrameForSection: i];

        UIView* shadowBackgroundView = [self viewWithTag: viewTag];
        if (shadowBackgroundView) {
            if (!CGRectEqualToRect(frameRect, shadowBackgroundView.frame)) {
                shadowBackgroundView.frame = frameRect;
                CGPathRef shadowPath = [UIBezierPath bezierPathWithRoundedRect: shadowBackgroundView.bounds 
                                                             byRoundingCorners: UIRectCornerAllCorners
                                                                   cornerRadii: CGSizeMake(PageCellBackgroundRadius, PageCellBackgroundRadius)].CGPath;
                shadowBackgroundView.layer.shadowPath = shadowPath;
            }

            [self sendSubviewToBack: shadowBackgroundView];
        } else {
            shadowBackgroundView = [[[UIView alloc] initWithFrame: frameRect] autorelease];
            shadowBackgroundView.tag = viewTag;
            shadowBackgroundView.opaque = YES;
            shadowBackgroundView.backgroundColor = [UIColor clearColor];

            shadowBackgroundView.layer.shadowOpacity = 0.3; 
            shadowBackgroundView.layer.shadowRadius = 2;
            shadowBackgroundView.layer.shadowColor = [[UIColor blackColor] CGColor];
            shadowBackgroundView.layer.shadowOffset = CGSizeMake(0.0, 1.0);
            CGPathRef shadowPath = [UIBezierPath bezierPathWithRoundedRect: shadowBackgroundView.bounds 
                                                         byRoundingCorners: UIRectCornerAllCorners
                                                               cornerRadii: CGSizeMake(PageCellBackgroundRadius, PageCellBackgroundRadius)].CGPath;
            shadowBackgroundView.layer.shadowPath = shadowPath;
            shadowBackgroundView.layer.shouldRasterize = YES;

            [self addSubview: shadowBackgroundView];
        }
    }
}

и небольшой вспомогательный метод:

- (CGRect) shadowFrameForSection: (NSInteger) section {
    CGRect sectionFrame = [self rectForSection: section];

    CGFloat sectionHeaderHeight = CGRectGetHeight([self rectForHeaderInSection: section]);
    CGFloat sectionFooterHeight = CGRectGetHeight([self rectForFooterInSection: section]);

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(sectionHeaderHeight + 1, 10, sectionFooterHeight + 1, 10);
    return UIEdgeInsetsInsetRect(sectionFrame, contentInsets);
}

код не требует пояснений, я думаю!в основном он вращается вокруг добавления UIViews к UITableView в качестве подпредставлений для вычисляемого кадра сечения, а затем отрисовки тени на слой добавленного UIView.UITableView предоставляет несколько методов для вычисления фрейма: "rectForSection" и т. Д.

Я не доволен этим, потому что он чувствует себя неправильно, добавляя представления в метод layoutSubviews!(это может быть сделано где-то еще => делегат табличного представления?) Мне также хотелось бы больше работать с CALayers, но вы не можете пометить их!потому что мой код работает за счет сокращения / расширения уже добавленных uiviews по соображениям производительности.

в этой форме решение не будет работать, если разделы исчезнут, или разделы переупорядочены и т. д., он также ведет себя не очень хорошо, если выдобавление строк в анимированном виде в табличное представление и т. д., но я думаю, что это очень полезно для «статических» сгруппированных табличных представлений!

я также не проверял на производительность, поэтому используйте на свой страх и риск!

так что, возможно, это хорошая отправная точка для, возможно, лучшего решения этой проблемы!: -)

2 голосов
/ 02 августа 2011

Проще всего было бы добавить стили падающих теней к слою к вашим ячейкам в таблице.Помните, что у вас будет 3 типа стилей - один для верхней части ячейки, один для нижней ячейки и один для других ячеек.Не должно быть очень сложно, если вы начнете писать код.

0 голосов
/ 26 октября 2014

В cellForRowAtIndexPath: Функция:

// drop shadow
cell.layer.shadowOpacity = 1.0;
cell.layer.shadowRadius = 1.7;
cell.layer.shadowColor = [UIColor blackColor].CGColor;
cell.layer.shadowOffset = CGSizeMake(0.0, 0.0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...