Почему маска не работает на UISearchBar - PullRequest
0 голосов
/ 07 февраля 2011

Я пытаюсь добавить закругленный угол к UISearchBar в верхнем левом и верхнем правом углах.

Однако я обнаружил, что слой маски не работает на UISearchBar, независимо от того, как я его установил.

Вот мой код

    // UIView* bar = [searchBar_.subviews objectAtIndex:0]; // try to add mask to background view but also failed

    UIView* bar = searchBar_;
    CGRect toolbarBounds = bar.bounds;
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect: toolbarBounds
                                               byRoundingCorners:UIRectCornerTopLeft 
                                                     cornerRadii:CGSizeMake(5.0f, 5.0f)];
    [maskLayer setPath:[path CGPath]];
    [maskLayer setFillColor:[[UIColor greenColor] CGColor]];
    bar.layer.masksToBounds = YES;
    bar.layer.mask = maskLayer;

Я также попробовал «Подвиды клипа», но он тоже не работает.

Затем я пытаюсь что-то еще, япросто установите фоновый вид (subview 0) скрытым.К моему удивлению, оно все еще видно.

Есть ли в UISearchBar какая-то магия?Маска работает на UIToolbar.

1 Ответ

0 голосов
/ 07 февраля 2011

Ваша проблема может быть связана с тем, как реализовано свойство mask.Это не будет работать, если вы добавите слой маски к слою, который уже является частью иерархии.Документы для CALayer говорят:

При установке mask на новый слой, суперслой нового слоя должен сначала быть установлен на nil, в противном случае поведение не определено.

Вам придется удалить панель поиска из ее superview перед добавлением маскирующего слоя.Завершите свою последнюю строку следующим образом:

UIView *superview = [bar superview];
[bar removeFromSuperview];
bar.layer.mask = maskLayer;
[superview addSubview:bar];

Вы также можете использовать removeFromSuperlayer и addSublayer:, если хотите.Кроме того, если ваша панель поиска не является верхним видом в вашей иерархии, убедитесь, что выяснили, где она находится, и поместите ее обратно в нужное место, используя insertSubview:atIndex: или один из аналогичных методов.

...