Пользовательская форма UIButton без использования изображения

Я хочу создать UIButton, похожий на UIBackBarButtonItem (со стрелкой, указывающей влево для стека навигации. Я бы предпочел сделать это без использования изображения, если это возможно, потому что кнопка будет иметь разный размер в зависимости от телефона). ориентация.

Есть ли способ активировать этот эффект в коде? Моя идея заключалась в том, чтобы каким-то образом использовать CALayer кнопки.

Спасибо!

РЕДАКТИРОВАТЬ

Я пытаюсь воспользоваться советом @Deepak, но столкнулся с проблемой. Я хочу, чтобы правая сторона кнопки выглядела как [UIBezierPath bezierPathWithRoundedRect:rect angleRadius:4], а левая сторона выглядела как стрелка. Я попытался сделать это с помощью метода addQuadCurveToPoint:controlPoint.

Я использую угол прямоугольника в качестве контрольной точки, но путь не изгибается, как я ожидаю. Он по-прежнему загнан в угол, как если бы я использовал только метод addLineToPoint:. Мой код ниже.

float radius = 4.0;
UIBezierPath *path = [UIBezierPath bezierPath];

CGPoint startPoint = CGPointMake(rect.size.width/5.0, 0);
CGPoint pointBeforeTopCurve = CGPointMake(rect.size.width - radius, 0);
CGPoint topRightCorner = CGPointMake(rect.size.width, 0);
CGPoint pointAfterTopCurve = CGPointMake(rect.size.width, 0.0-radius);

CGPoint pointBeforeBottomCurve = CGPointMake(rect.size.width, rect.size.height-radius);
CGPoint bottomRightCorner = CGPointMake(rect.size.width, rect.size.height);
CGPoint pointAfterBottomCurve = CGPointMake(rect.size.width - radius, rect.size.height);

CGPoint pointBeforeArrow = CGPointMake(rect.size.width/5.0, rect.size.height);
CGPoint arrowPoint = CGPointMake(0, rect.size.height/2.0);


[path moveToPoint:pointBeforeTopCurve];
[path addQuadCurveToPoint:pointAfterTopCurve controlPoint:topRightCorner];

[path addLineToPoint:pointBeforeBottomCurve];
[path addQuadCurveToPoint:pointAfterBottomCurve controlPoint:bottomRightCorner];


[path addLineToPoint:pointBeforeArrow];
[path addLineToPoint:arrowPoint];
[path addLineToPoint:startPoint];

person Ross Kimes    schedule 31.05.2011    source источник
comment
Проверьте это stackoverflow.com/questions/6184321/   -  person Jhaliya - Praveen Sharma    schedule 31.05.2011


Ответы (2)


Вы можете сделать это с помощью Quartz. Вам понадобится подкласс UIButton и реализовать его метод drawRect:. Вам нужно будет определить путь и заполнить его градиентом.

Вам также придется реализовать hitTest:withEvent:, так как он включает непрямоугольную форму.

person Deepak Danduprolu    schedule 31.05.2011

Это решило трудности с рисованием для меня.

    float radius = 10.0;
UIBezierPath *path = [UIBezierPath bezierPath];

CGPoint startPoint = CGPointMake(rect.size.width/5.0, 0);
CGPoint pointBeforeTopCurve = CGPointMake(rect.size.width - radius, 0);
CGPoint topRightCorner = CGPointMake(rect.size.width, 0.0);
CGPoint pointAfterTopCurve = CGPointMake(rect.size.width, radius);

CGPoint pointBeforeBottomCurve = CGPointMake(rect.size.width, rect.size.height-radius);
CGPoint bottomRightCorner = CGPointMake(rect.size.width, rect.size.height);
CGPoint pointAfterBottomCurve = CGPointMake(rect.size.width - radius, rect.size.height);

CGPoint pointBeforeArrow = CGPointMake(rect.size.width/5.0, rect.size.height);
CGPoint arrowPoint = CGPointMake(0.0, rect.size.height/2.0);


[path moveToPoint:pointBeforeTopCurve];
[path addQuadCurveToPoint:pointAfterTopCurve controlPoint:topRightCorner];

[path addLineToPoint:pointBeforeBottomCurve];
[path addQuadCurveToPoint:pointAfterBottomCurve controlPoint:bottomRightCorner];


[path addLineToPoint:pointBeforeArrow];
[path addLineToPoint:arrowPoint];
[path addLineToPoint:startPoint];


[path fill];
person Chris Pillen    schedule 19.03.2012