Как округленный прямоугольный вид с прозрачностью на iphone?

Многие приложения открывают прозрачный вид с закругленными углами и ActivityIndicator при выполнении многоразовой операции.

Как это округление сделано, и можно ли это сделать только с помощью Interface Builder (так как есть много мест, которые я хотел бы использовать что-то вроде этого)? Или, следует ли использовать изображение с закругленным прямоугольным или растягиваемым изображением? Нужно ли рисовать фон?

До сих пор мне удалось получить базовый вид с аналогичной прозрачностью, установив alphaValue в Interface Builder, но он не имеет закругленных углов, а прозрачность, по-видимому, применима ко всем подзонам (я не хочу, чтобы текст и указатель активности должны быть прозрачными, однако, хотя я устанавливаю alphaValue на те, что в IB, кажется, игнорируется).

Ответ 1

view.layer.cornerRadius = radius;

Жесткий путь (который раньше требовался в первом SDK для iPhone) - создать свой собственный подкласс UIView с помощью метода drawRect::

 CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextSetRGBFillColor(context, 0,0,0,0.75);

 CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius);
 CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius);
 CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius, 
                radius, M_PI, M_PI / 2, 1); //STS fixed
 CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius, 
                        rect.origin.y + rect.size.height);
 CGContextAddArc(context, rect.origin.x + rect.size.width - radius, 
                rect.origin.y + rect.size.height - radius, radius, M_PI / 2, 0.0f, 1);
 CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + radius);
 CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + radius, 
                radius, 0.0f, -M_PI / 2, 1);
 CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y);
 CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius, 
                -M_PI / 2, M_PI, 1);

 CGContextFillPath(context);

Примечание: rect в этом коде следует брать из [self bounds] (или любого другого места, в котором вы хотите), это не имеет смысла с rect, переданным методу drawRect:.

Ответ 2

С iPhone SDK 3.0 вы можете просто использовать свойство layer cornerRadius. Например:.

view.layer.cornerRadius = 10.0;

В тех же строках вы можете изменить цвет и ширину рамки представления:

view.layer.borderColor = [[UIColor grayColor] CGColor];
view.layer.borderWidth = 1;

Ответ 3

Я отбросил ответ @lostInTransit в эту функцию:

static void ContextAddRoundedRect(CGContextRef c, CGRect rect, CGFloat radius) {
  CGFloat minX = CGRectGetMinX(rect);
  CGFloat maxX = CGRectGetMaxX(rect);
  CGFloat minY = CGRectGetMinY(rect);
  CGFloat maxY = CGRectGetMaxY(rect);

  CGContextMoveToPoint(c, minX + radius, minY);
  CGContextAddArcToPoint(c, maxX, minY, maxX, minY + radius, radius);
  CGContextAddArcToPoint(c, maxX, maxY, maxX - radius, maxY, radius);
  CGContextAddArcToPoint(c, minX, maxY, minX, maxY - radius, radius);
  CGContextAddArcToPoint(c, minX, minY, minX + radius, minY, radius);
}

который помещает путь в контекст для вас, как вы можете

несколько разных вызовов CoreGraphics, и я не закрывал путь, если вы хотите добавить, что

CGContextFillPath(c);

Ответ 4

В вашем представлении сделайте это в методе drawRect

float radius = 5.0f;

CGRect rect = self.bounds;
CGContextRef context = UIGraphicsGetCurrentContext();   
rect = CGRectInset(rect, 1.0f, 1.0f);

CGContextBeginPath(context);
CGContextSetGrayFillColor(context, 0.5, 0.7);
CGContextMoveToPoint(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect));
CGContextAddArc(context, CGRectGetMaxX(rect) - radius, CGRectGetMinY(rect) + radius, radius, 3 * M_PI / 2, 0, 0);
CGContextAddArc(context, CGRectGetMaxX(rect) - radius, CGRectGetMaxY(rect) - radius, radius, 0, M_PI / 2, 0);
CGContextAddArc(context, CGRectGetMinX(rect) + radius, CGRectGetMaxY(rect) - radius, radius, M_PI / 2, M_PI, 0);
CGContextAddArc(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect) + radius, radius, M_PI, 3 * M_PI / 2, 0);

CGContextClosePath(context);
CGContextFillPath(context);

Это сделает ваш округленный прямоугольник для вашего вида. Вы можете найти полный пример в примере HeadsUpUI, предоставленном SDK. НТН