多くのアプリは、時間がかかる操作を実行すると、角が丸い透明なビューとactivityIndicatorをポップアップします。
この丸めはどのように行われ、Interface Builderを使用するだけで可能ですか(このようなものを使用したい場所がたくさんあるので)?または、丸みを帯びた四角形または伸縮可能な画像のあるimageviewを使用する必要がありますか?背景を自分で描く必要がありますか?
これまでのところ、Interface BuilderでalphaValueを設定することで、同様の透明度を持つ基本的なビューを取得できましたが、角が丸くなく、透明度はすべてのサブビューに適用されるようです(テキストとアクティビティインジケーターは必要ありません)透明にするために、IBのalphaValueを設定しても無視されるようです)。
view.layer.cornerRadius = radius;
(最初のiPhone SDKで必要であった)難しい方法は、drawRect:
メソッドを使用して独自のUIView
サブクラスを作成することです。
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:
に渡しても意味がありません。方法。
IPhone SDK 3.0以降では、レイヤーのcornerRadius
プロパティを使用するだけで済みます。例えば。:
view.layer.cornerRadius = 10.0;
同じ線に沿って、ビューの境界線の色と幅を変更できます。
view.layer.borderColor = [[UIColor grayColor] CGColor];
view.layer.borderWidth = 1;
@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);
あなたの見解では、これを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);
これにより、ビューの角丸長方形が作成されます。完全な例は、SDKに付属のHeadsUpUIサンプルにあります。 HTH
MBProgressHUD ...
http://www.cocoadev.com/index.pl?MBProgressHUD