Как округленный прямоугольный вид с прозрачностью на 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. НТН
Ответ 5
MBProgressHUD....
http://www.cocoadev.com/index.pl?MBProgressHUD