CAShapeLayer с UIRectCornerBottomLeft / Right делает мой взгляд исчезающим

ОК. Я выполнил поиск Google, поиск в стеке, поиск Wenderlich (это еще что-нибудь?). Я пробовал все здесь при переполнении, и ничего не работает.

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

У меня есть 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; } 

ПРИМЕЧАНИЕ. Я также попытался добавить маску к слою, например, в нескольких углах UIView и вокруг границы слоя вида.

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

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

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

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

One Solution collect form web for “CAShapeLayer с UIRectCornerBottomLeft / Right делает мой взгляд исчезающим”

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

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

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

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

введите описание изображения здесь

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

Просто 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; 
  • Как обрабатывать ссылки на UITextFields в динамическом UITableView (iPhone)
  • Сделать эффект встряски для ярлыка в ios?
  • Шрифт и textColor исчезли - еще один UITableViewCell awakeFromNib
  • Как изменить backgroundColor для всех UITableViewCells
  • Как повторно использовать UIView, например UITableViewCell
  • перезагрузка видимой uicollectionviewcell при вложенности в uitableviewcell
  • Как настроить заголовок секции TableView с помощью XIB?
  • searchBar перекрывается видом заголовка раздела
  • numberOfRowsInSection вызвало слишком много времени после reloadData
  • В представлении UITableViewController неверный фрейм при вводе в встроенный UINavigationController
  • Загрузка данных JSON в таблицу не работает
  • Могу ли я остановить индикатор раскрытия информации о ячейке, если она выбрана?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.