Как заставить UITableView работать с маской CAShapeLayer?

Я хотел бы замаскировать UITableView в форме треугольника. Мой первый подход заключался в настройке CAShapeLayer и добавлении его в качестве маски непосредственно в представление таблицы. Но затем я получил треугольную форму, прокручивающуюся вместе с представлением таблицы.

Мой следующий подход заключался в том, чтобы поместить представление таблицы в UIView в качестве суперпредставления с точно такой же позицией и размером. В приведенном ниже фрагменте кода self.triangleView является суперпредставлением.

- (void)viewDidLoad
{
    [super viewDidLoad];

    CAShapeLayer *mask = [[[CAShapeLayer alloc] init] autorelease];
    mask.frame = _tableView.bounds;
    mask.fillColor = [[UIColor blackColor] CGColor];

    CGFloat width = self.triangleView.frame.size.width;
    CGFloat height = self.triangleView.frame.size.height;

    CGMutablePathRef path = CGPathCreateMutable();

    // draw the triangle
    CGPathMoveToPoint(path, NULL, 0, height);
    CGPathAddLineToPoint(path, NULL, width, 0);
    CGPathAddLineToPoint(path, NULL, width, height);
    CGPathCloseSubpath(path);

    mask.path = path;
    CGPathRelease(path);

    self.triangleView.layer.mask = mask;
}

Это работает до сих пор, потому что теперь у меня есть табличное представление в форме треугольника. Но теперь у меня проблема, что я не могу прокручивать таблицу. Superview не направляет прикосновения к табличному представлению внутри. Любые идеи?


person iMarcel    schedule 05.07.2012    source источник


Ответы (2)


TableView является подклассом UIScrollView. И UITableViewDelegate соответствует UIScrollViewDelegate, поэтому вы можете переопределить scrollViewDidScroll и переместить слой маски в соответствии с UIScrollView contentOffset.

person javieralog    schedule 05.07.2012

Решение состояло в том, чтобы использовать еще один UIView в иерархии, чтобы затем замаскировать их верхнюю часть. Звучит странно, но у меня работает.

person iMarcel    schedule 18.07.2012