Просто два закругленных угла?

В моем приложении для iPad я хочу, чтобы второе представление появлялось в главном, когда пользователь нажимает кнопку. Новый вид будет меньше первого и затемнит фон при его отображении. Я хочу, чтобы верхние два угла нового вида выглядели закругленными, но при использовании cornerRadius все они округляются. Как я могу сделать только два угла закругленными?

3 ответа

Решение

Вы должны сделать это в drawRect:. Я на самом деле изменил классический addRoundedRectToPath: так, чтобы он взял растровое изображение и закругил углы, которые вы запрашиваете:

static void addRoundedRectToPath(CGContextRef context, CGRect rect, float radius, UIImageRoundedCorner cornerMask)
{
    CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius);
    CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius);
    if (cornerMask & UIImageRoundedCornerTopLeft) {
        CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius, 
                        radius, M_PI, M_PI / 2, 1);
    }
    else {
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height);
        CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y + rect.size.height);
    }

    CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius, 
                          rect.origin.y + rect.size.height);

    if (cornerMask & UIImageRoundedCornerTopRight) {
        CGContextAddArc(context, rect.origin.x + rect.size.width - radius, 
                        rect.origin.y + rect.size.height - radius, radius, M_PI / 2, 0.0f, 1);
    }
    else {
        CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + rect.size.height);
        CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + rect.size.height - radius);
    }

    CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + radius);

    if (cornerMask & UIImageRoundedCornerBottomRight) {
        CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + radius, 
                        radius, 0.0f, -M_PI / 2, 1);
    }
    else {
        CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y);
        CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius, rect.origin.y);
    }

    CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y);

    if (cornerMask & UIImageRoundedCornerBottomLeft) {
        CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius, 
                        -M_PI / 2, M_PI, 1);
    }
    else {
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y);
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + radius);
    }

    CGContextClosePath(context);
}

Это займет немного маски (я назвал это UIImageRoundedCorner, потому что я делал это для изображений, но вы можете называть это как угодно), а затем выстраивает путь на основе углов, которые вы хотите округлить. Затем вы применяете этот путь к представлению в drawRect:

CGContextBeginPath(context);
addRoundedRectToPath(context, rect, radius, yourMask);
CGContextClosePath(context);
CGContextClip(context);

Как я уже сказал, я делал это для UIImages, поэтому мой код не совсем настроен для использования в drawRect:, но его должно быть довольно легко адаптировать. Вы просто создаете путь и затем обрезаете контекст к нему.

Изменить: Чтобы объяснить часть битовой маски, это просто перечисление:

typedef enum {
    UIImageRoundedCornerTopLeft = 1,
    UIImageRoundedCornerTopRight = 1 << 1,
    UIImageRoundedCornerBottomRight = 1 << 2,
    UIImageRoundedCornerBottomLeft = 1 << 3
} UIImageRoundedCorner;

Таким образом, вы можете объединить ИЛИ вместе, чтобы сформировать битовую маску, которая идентифицирует углы, так как каждый член перечисления представляет различную степень двойки в битовой маске.

Много позже Править: я обнаружил более простой способ сделать это, используя UIBezierPath "s bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:, Просто используйте объект Безье пути CGPath в вашем контексте.

В цели C

   // Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds 
                          byRoundingCorners:UIRectCornerTopLeft| UIRectCornerTopRight
                          cornerRadii:CGSizeMake(10.0, 10.0)];
// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;
// Set the newly created shape layer as the mask for the image view's layer
imageView.layer.mask = maskLayer;

Это другое использование верхнего закругленного угла. Раунд два угла в UIView

Свифт!!!

myView.clipsToBounds = true
myView.layer.cornerRadius = 10
myView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner]

Прекрасная работа Томека Куммы. Вот новый класс TKRoundedView для вашего требования.
Ваше требование может быть выполнено только по этому параметру.

TKRoundedView *view = [[TKRoundedView alloc] initWithFrame:frame];
view.roundedCorners = TKRoundedCornerTopLeft | TKRoundedCornerTopRight;

Но это также обеспечивает следующие дополнительные функции.

TKRoundedView *view = [[TKRoundedView alloc] initWithFrame:frame];
view.roundedCorners = TKRoundedCornerTopLeft
view.borderColor = [UIColor greenColor];
view.fillColor = [UIColor whiteColor];
view.drawnBordersSides = TKDrawnBorderSidesLeft | TKDrawnBorderSidesTop;
view.borderWidth = 5.0f;
view.cornerRadius = 15.0f;

Пожалуйста, проверьте следующую ссылку для примера проекта
https://github.com/mapedd/TKRoundedView

Другие вопросы по тегам