Создать собственный закругленный угол кнопки прямоугольника в верхнем левом углу?

У меня есть пользовательская кнопка, которую я хочу сделать, чтобы верхняя левая граница выглядела как обычный круглый прямоугольник.

Я нашел код, который делает все углы круглыми:

_myButton.layer.cornerRadius = 8;
_myButton.layer.borderWidth = 0.5;
_myButton.layer.borderColor = [UIColor grayColor].CGColor;
_myButton.clipsToBounds = YES;

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

Как я могу исправить код, чтобы сделать его круглым только в верхней левой части?


Редактировать:

_myButton.layer.borderWidth = 2;
_myButton.layer.borderColor = [UIColor blackColor].CGColor;

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_myButton.bounds
                                                    byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight
                                                        cornerRadii:CGSizeMake(7.0, 7.0)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];

maskLayer.frame = _myButton.bounds;
maskLayer.path = maskPath.CGPath;
_myButton.layer.mask = maskLayer;
[maskLayer release];

Этот код не работает. Вся кнопка исчезает.


person Ali    schedule 08.10.2012    source источник
comment
Вот аналогичный вопрос/ответ о том, как вы можете использовать UIBezierPath, чтобы указать, какие углы сохранить/маскировать в UIView: stackoverflow.com/questions/10995226/   -  person Brayden    schedule 09.10.2012
comment
Я использовал приведенный там код. Но это не работает. Я добавил код в конец вопроса. ты можешь мне помочь @Brayden?   -  person Ali    schedule 09.10.2012


Ответы (1)


У вас почти получилось, но после создания CAShapeLayer используйте его, чтобы добавить себя в качестве подслоя слоя вашей кнопки, а не в качестве альфа-маски, чтобы скрыть некоторые части вашей кнопки (в данном случае углы).

UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(10,300,300,40);
[button setTitle:@"Hey" forState:(UIControlStateNormal)];
[button setTitleColor:[UIColor blueColor] forState:(UIControlStateNormal)];

UIBezierPath *shapePath = [UIBezierPath bezierPathWithRoundedRect:button.bounds
                                                byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight
                                                      cornerRadii:CGSizeMake(7.0, 7.0)];

CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.frame = button.bounds;
shapeLayer.path = shapePath.CGPath;
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.strokeColor = [UIColor blackColor].CGColor;
shapeLayer.lineWidth = 2;
[button.layer addSublayer:shapeLayer];

[self.view addSubview:button];
person AliSoftware    schedule 08.10.2012
comment
спасибо, посмотрите на эту строку: [_myButton.layer addSublayer:shapePath]; Вы имеете в виду shapeLayerвместо shapePath? - person Ali; 09.10.2012
comment
это я и имел в виду сори. Что ты имеешь в виду под не сработало, как это выглядело? - person AliSoftware; 09.10.2012
comment
Он не показывает границы. Я просто вижу текст кнопки. Нет границ. - person Ali; 09.10.2012
comment
Я не понимаю, я только что попробовал это в примере проекта, и это сработало, я получил границу вокруг… - person AliSoftware; 09.10.2012
comment
Так странно, вы можете отправить мне проект? это моя электронная почта: [email protected] - person Ali; 09.10.2012
comment
Вы уверены, что создали слой после установки рамки кнопки? Может быть, когда вы создали shapePath и установили frame для CAShapeLayer, вы использовали неправильное значение, потому что frame для _myButton еще не было установлено правильное значение? - person AliSoftware; 09.10.2012
comment
На самом деле я очень быстро поместил свой код в viewDidLoad моего текущего проекта, но я просто скопировал то, что написал. Я добавлю каждую окружающую строку кода в свой ответ - person AliSoftware; 09.10.2012
comment
Да, я. Я просто скопировал ваш код, но если он у вас работает, пришлите мне проект. Я действительно ценю. - person Ali; 09.10.2012
comment
давайте продолжим это обсуждение в чате - person Ali; 09.10.2012