2015-06-05 1 views
3

OK. Я выполнил поиск Google, поиск в стеке, поиск Wenderlich (это еще что-нибудь?). Я пробовал все здесь при переполнении, и ничего не работает.CAShapeLayer с UIRectCornerBottomLeft/Right делает мой взгляд пропавшим

Мне нужен эксперт CALayer.

У меня есть tableView, который я показываю как раскрывающийся список из верхней части моего приложения. Он показывает тонкий и денди, пока я не попытаюсь обогнуть нижние левые/правые углы. Каждая попытка, которую я пыталась сделать, привела к тому, что моя таблица полностью исчезла. Способы по-прежнему срабатывают, и я получаю доработки для методов вверх/вниз. Однако таблица просто исчезает.

Код с Tableview:

- (void)setupTopMenu { 
    CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width; 

    self.topMenuTable = [[UITableView alloc] initWithFrame:CGRectMake((screenWidth/2) - ((screenWidth - topMenuSideBuffer)/2), self.view.frame.origin.y + topBuffer, (screenWidth - topMenuSideBuffer), 0) style:UITableViewStylePlain]; 
    self.topMenuTable.backgroundColor = DARK_BLUE_NAVBAR_COLOR; 
    self.topMenuTable.dataSource = self; 
    self.topMenuTable.delegate = self; 
    self.topMenuTable.scrollEnabled = YES; 
    self.topMenuTable.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
    self.topMenuTable.separatorColor = [UIColor blackColor]; 
    self.topMenuTable.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 
    self.topMenuTable.layer.borderColor = [UIColor blackColor].CGColor; 
    self.topMenuTable.layer.borderWidth = 0.4f; 

    UIBezierPath *maskPath; 
    maskPath = [UIBezierPath bezierPathWithRoundedRect:self.topMenuTable.bounds byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(5.0, 5.0)]; 

    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
    maskLayer.frame = self.view.bounds; 
    maskLayer.path = maskPath.CGPath; 
    self.topMenuTable.layer.mask = maskLayer; 

    [self.view addSubview:self.topMenuTable]; 
} 

код только с точки зрения (я подумал, что это было что-то делать с Tableview, но он ведет себя так же, когда я использую регулярные UIView)

- (void)setupTopMenu { 
    CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width; 

    self.topMenuView = [[UIView alloc] initWithFrame:CGRectMake((screenWidth/2) - ((screenWidth - topMenuSideBuffer)/2), self.view.frame.origin.y + topBuffer, (screenWidth - topMenuSideBuffer), 0)]; 
    self.topMenuView.backgroundColor = [UIColor redColor]; 
    self.topMenuView.layer.borderColor = [UIColor blackColor].CGColor; 
    self.topMenuView.layer.borderWidth = 0.4f; 

    UIBezierPath *maskPath; 
    maskPath = [UIBezierPath bezierPathWithRoundedRect:self.topMenuView.bounds byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(5.0, 5.0)]; 

    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
    maskLayer.frame = self.view.bounds; 
    maskLayer.path = maskPath.CGPath; 
    self.topMenuView.layer.mask = maskLayer; 

    [self.view addSubview:self.topMenuView]; 
} 

код, я использую, чтобы показать вид (ы):

- (void)showTopMenu { 

    if (!isTopMenuDown) { 
     [UIView animateWithDuration:0.45 animations:^ { 
      //self.topMenuTable.frame = CGRectMake((self.screenWidth/2) - (self.topMenuWidth/2), self.view.bounds.origin.y + topBuffer, self.topMenuWidth, self.topMenuHeight); 
      self.topMenuView.frame = CGRectMake((self.screenWidth/2) - (self.topMenuWidth/2), self.view.bounds.origin.y + topBuffer, self.topMenuWidth, self.topMenuHeight); 
     } completion:^(BOOL finished) { 

     }]; 
    } else { 
     [UIView animateWithDuration:0.35 animations:^ { 
      // self.topMenuTable.frame = CGRectMake((self.screenWidth/2) - (self.topMenuWidth /2), self.view.bounds.origin.y + topBuffer, self.topMenuWidth, 0); 
      self.topMenuView.frame = CGRectMake((self.screenWidth/2) - (self.topMenuWidth /2), self.view.bounds.origin.y + topBuffer, self.topMenuWidth, 0); 
     } completion:^ (BOOL finished) { 

     }]; 
    } 

    isTopMenuDown =! isTopMenuDown; 
} 

ПРИМЕЧАНИЕ: Я также пробовал идею O f добавление маски к слою, как в Round some corners of UIView and round the view’s layer’s border too

Тот же результат.

Если я вырву код Layer, изображения будут отображаться отлично, но с помощью кода слоя они исчезнут.

Есть ли что-то о том, как я показываю представление, которое я не вижу, что заставляет его исчезнуть?

Спасибо за помощь.

ответ

1

Я подумал, что это было что-то делать с Tableview, но он ведет себя так же, когда я использовать обычный UIView

Точно так - потому что это не имеет ничего общего с точки зрения таблицы. Это связано с тем, что вы не понимаете, что такое маска.

Маскирующий слой блокирует части своего слоя в зависимости от прозрачности слоя маски. Вы ничего не сделали для выделения непрозрачных частей маски из прозрачных частей. Вся ваша маска прозрачна. Таким образом, все слоя - это означает, что все виды - заблокированы (невидимы).

Мне кажется, вы описываете что-то вроде этого (я преувеличил округление углов, только для отображения):

enter image description here

То есть прямоугольник с маской на него. Маска состоит из закругленного прямоугольника , заполненного. Таким образом, интерьер пути непрозрачен и появляется; внешний вид прозрачен и не появляется.

Просто FYI, вот как я создал маску и добавить его (я использовал изображение и contents, но вы, конечно, можете использовать слой формы, если вы хотите):

UIView* viewToMask = self.view.subviews[0]; 
UIGraphicsBeginImageContextWithOptions(viewToMask.bounds.size, NO, 0); 
UIBezierPath* round = [UIBezierPath bezierPathWithRoundedRect:viewToMask.bounds byRoundingCorners: (UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(50,50)]; 
[round fill]; 
UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
CALayer* mask = [CALayer new]; 
mask.frame = viewToMask.bounds; 
mask.contents = (id)result.CGImage; 
viewToMask.layer.mask = mask; 
+0

Ой и спасибо. – addzo