AとBの関係をベン図に表示するiPhoneアプリのサンプルコードを描いてみます。
#import “ViewController.h”
@interface ViewController ()
@property (nonatomic, weak) UIView *mainArea;
@property (nonatomic, weak) CAShapeLayer *A;
@property (nonatomic, weak) CAShapeLayer *B;
@property (nonatomic, weak) CAShapeLayer *AB;
@end
@implementation ViewController
– (void)viewDidLoad
{
self.view.backgroundColor = [UIColor darkGrayColor];
[super viewDidLoad];
[self createButtons];
[self createMainArea];
}
– (void)createButtons
{
NSArray *word = @[@”A ∨ B”, @”A ∧ B”, @”A ⊕ B”, @”A = B”];
for (int i=0; i<4; i++) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame= CGRectMake(0, 0, 120, 32);
btn.layer.cornerRadius = 10;
btn.layer.borderWidth = 1;
btn.layer.borderColor = [UIColor whiteColor].CGColor;
btn.layer.masksToBounds = YES;
btn.titleLabel.font = [UIFont boldSystemFontOfSize:20];
[btn setBackgroundImage:[self imageWithColor:[UIColor darkGrayColor]] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
[btn setTitle:word[i] forState:UIControlStateNormal];
btn.center = CGPointMake(240, 330 + 40 * i);
[self.view addSubview:btn];
[btn addTarget:self action:@selector(tap:) forControlEvents:UIControlEventTouchUpInside];
}
}
– (void)createMainArea
{
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(20, 80, 280, 200)];
v.backgroundColor = [UIColor whiteColor];
v.layer.cornerRadius = 10;
[self.view addSubview:v];
self.mainArea = v;
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-70, –50, 140, 100)];
for (int i=0; i<2; i++) {
float x = i ? 110 : 210;
UILabel *l = [[UILabel alloc] init];
l.text = i ? @”A” : @”B”;
[l sizeToFit];
l.center = CGPointMake(x, 140);
[self.view addSubview:l];
CAShapeLayer *oval = [CAShapeLayer layer];
oval.path = path.CGPath;
oval.position = CGPointMake(l.center.x, 200);
oval.fillColor = [UIColor clearColor].CGColor;
oval.strokeColor = [UIColor darkGrayColor].CGColor;
oval.lineWidth = 1;
[self.view.layer addSublayer:oval];
if (i==0) self.A = oval;
else self.B = oval;
}
UIBezierPath *maskPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-120, –50, 140, 100)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.path = maskPath.CGPath;
maskLayer.fillRule = kCAFillRuleEvenOdd;
UIBezierPath *abPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-20, –50, 140, 100)];
CAShapeLayer *ab = [CAShapeLayer layer];
ab.path = abPath.CGPath;
ab.position = CGPointMake(160, 200);
ab.fillColor = [UIColor whiteColor].CGColor;
ab.transform = CATransform3DMakeScale(0.98, 0.98, 1);
ab.mask = maskLayer;
[self.view.layer addSublayer:ab];
self.AB = ab;
// wire overlay
CAShapeLayer *oval = [CAShapeLayer layer];
oval.path = path.CGPath;
oval.position = CGPointMake(210, 200);
oval.fillColor = [UIColor clearColor].CGColor;
oval.strokeColor = [UIColor darkGrayColor].CGColor;
oval.lineWidth = 1;
[self.view.layer addSublayer:oval];
}
– (void)tap:(UIButton *)sender
{
self.mainArea.backgroundColor = [UIColor whiteColor];
NSString *op = sender.titleLabel.text;
if ([op isEqual:@”A ∨ B”]) {
self.A.fillColor = [UIColor greenColor].CGColor;
self.B.fillColor = [UIColor greenColor].CGColor;
self.AB.fillColor = [UIColor greenColor].CGColor;
} else if ([op isEqual:@”A ∧ B”]) {
self.A.fillColor = [UIColor whiteColor].CGColor;
self.B.fillColor = [UIColor whiteColor].CGColor;
self.AB.fillColor = [UIColor greenColor].CGColor;
} else if ([op isEqual:@”A ⊕ B”]) {
self.A.fillColor = [UIColor greenColor].CGColor;
self.B.fillColor = [UIColor greenColor].CGColor;
self.AB.fillColor = [UIColor whiteColor].CGColor;
} else if ([op isEqual:@”A = B”]) {
self.mainArea.backgroundColor = [UIColor greenColor];
self.A.fillColor = [UIColor whiteColor].CGColor;
self.B.fillColor = [UIColor whiteColor].CGColor;
self.AB.fillColor = [UIColor greenColor].CGColor;
}
}
– (UIImage *)imageWithColor:(UIColor *)color
{
CGRect rect = CGRectMake(0, 0, 1, 1);
UIGraphicsBeginImageContext(rect.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx, color.CGColor);
CGContextFillRect(ctx, rect);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
@end