iPhoneベン図でAB

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