답변:
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
클래스 메서드를 재정 의하여 모양 레이어로 만들 수 있습니다.
스위프트 확장에 대한 나의 기여 :
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
위 코드의 결과는 다음과 같습니다.
스위프트 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
}