回答:
あなたはQuartzCoreを使用してこれを行うことができます-
self.circleView = [[UIView alloc] initWithFrame:CGRectMake(10,20,100,100)];
self.circleView.alpha = 0.5;
self.circleView.layer.cornerRadius = 50; // half the width/height
self.circleView.backgroundColor = [UIColor blueColor];
drawRectメソッドをオーバーライドするだけですか?
はい:
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextAddEllipseInRect(ctx, rect);
CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor blueColor] CGColor]));
CGContextFillPath(ctx);
}
また、クラス自体の中でそのビューのフレームを変更しても大丈夫でしょうか?
理想的にはそうではありませんが、できます。
または、フレームを別のクラスから変更する必要がありますか?
私は親にそれを制御させます。
CGContextSetFillColorWithColor(ctx, self.colorOfCircle.CGColor);
、溶液中で提案された方法は、CGColorGetComponents
唯一のいくつかの色で動作し、参照stackoverflow.com/questions/9238743/...
rect
、誤っself.frame
て楕円に使用しました。正しい値はself.bounds
です。ああ!:)
以下は、UIBezierPathを使用した別の方法です(多分それは遅すぎるかもしれません^^)次のように、円を作成し、それでUIViewをマスクします。
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
view.backgroundColor = [UIColor blueColor];
CAShapeLayer *shape = [CAShapeLayer layer];
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:view.center radius:(view.bounds.size.width / 2) startAngle:0 endAngle:(2 * M_PI) clockwise:YES];
shape.path = path.CGPath;
view.layer.mask = shape;
layerClass
クラスメソッドをオーバーライドしてシェイプレイヤーにすることができます。
Swift拡張機能での私の貢献:
extension UIView {
func asCircle() {
self.layer.cornerRadius = self.frame.width / 2;
self.layer.masksToBounds = true
}
}
電話するだけ myView.asCircle()
masksToBounds
trueに設定して使用することself
はすべてオプションですが、それでも最短かつ最良のソリューションです
円(および他の形状)の描画にアプローチする別の方法は、マスクを使用することです。最初に、必要な形状のマスクを作成することにより、円またはその他の形状を描画します。次に、自分の色の四角形を用意し、次に、それらの色の四角形にマスクを適用します。マスクまたは色を変更して、新しいカスタムサークルまたは他の形状を取得できます。
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *area1;
@property (weak, nonatomic) IBOutlet UIView *area2;
@property (weak, nonatomic) IBOutlet UIView *area3;
@property (weak, nonatomic) IBOutlet UIView *area4;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.area1.backgroundColor = [UIColor blueColor];
[self useMaskFor: self.area1];
self.area2.backgroundColor = [UIColor orangeColor];
[self useMaskFor: self.area2];
self.area3.backgroundColor = [UIColor colorWithRed: 1.0 green: 0.0 blue: 0.5 alpha:1.0];
[self useMaskFor: self.area3];
self.area4.backgroundColor = [UIColor colorWithRed: 1.0 green: 0.0 blue: 0.5 alpha:0.5];
[self useMaskFor: self.area4];
}
- (void)useMaskFor: (UIView *)colorArea {
CALayer *maskLayer = [CALayer layer];
maskLayer.frame = colorArea.bounds;
UIImage *maskImage = [UIImage imageNamed:@"cirMask.png"];
maskLayer.contents = (__bridge id)maskImage.CGImage;
colorArea.layer.mask = maskLayer;
}
@end
上記のコードの出力は次のとおりです。
Swift 3-Xcode 8.1
@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let size:CGFloat = 35.0
myView.bounds = CGRect(x: 0, y: 0, width: size, height: size)
myView.layer.cornerRadius = size / 2
myView.layer.borderWidth = 1
myView.layer.borderColor = UIColor.Gray.cgColor
}