Изменить цвет UIBezierPath при выборе

Я рисую 3 квадрата в - LayoutView

- (void)drawRect:(CGRect)rect

    self.room1 = [UIBezierPath bezierPathWithRect:CGRectMake(81, 10, 60, 60)];
    [self.normalColor setFill];
    [self.room1 fill];
    [[UIColor blackColor]setStroke];
    self.room1.lineWidth = 1;
    [self.room1 stroke];

затем я нахожу правильный UIBezierPath с помощью

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touch here");

    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
    if ([self.room1 containsPoint:touchPoint])
    {
        // do stuff
        NSLog(@"room1 %@" , self.room1);

        [[UIColor redColor] setFill];
        [self.room1 fill];
        [self setNeedsDisplay];
    } 
}

это работает, я касаюсь комнаты 1, и журнал печатает «room1»

Но как изменить цвет room1?

На данный момент я получаю сообщение об ошибке

: CGContextSetFillColorWithColor: неверный контекст 0x0. Это серьезная ошибка. ...

Спасибо за вашу помощь.


person HernandoZ    schedule 14.10.2013    source источник


Ответы (1)


Один из способов добиться этого — отслеживать выбранное состояние в методе touchesBegan и хранить все операторы fill и setFill внутри drawRect. В следующем примере я переключаю выбранное состояние при каждом прикосновении к квадрату, который меняет цвет между синим и красным.

@interface RDView ()
@property (strong,nonatomic) UIBezierPath *room1;
@property (strong,nonatomic) UIColor *normalColor;
@property (strong,nonatomic) UIColor *selectedColor;
@property (nonatomic) BOOL isSelected;
@end

@implementation RDView

-(id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        self.normalColor = [UIColor blueColor];
        self.selectedColor = [UIColor redColor];
        self.isSelected = NO;
    }
    return self;
}

- (void)drawRect:(CGRect)rect {

    self.room1 = [UIBezierPath bezierPathWithRect:CGRectMake(81, 10, 60, 60)];
    UIColor *colorToUse = (self.isSelected)? self.selectedColor : self.normalColor;
    [colorToUse setFill];
    [self.room1 fill];
    [[UIColor blackColor]setStroke];
    self.room1.lineWidth = 1;
    [self.room1 stroke];
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint touchPoint = [touches.anyObject locationInView:self];
    if ([self.room1 containsPoint:touchPoint]){
        self.isSelected = ! self.isSelected;
        [self setNeedsDisplay];
    }
}
person rdelmar    schedule 14.10.2013
comment
Большое спасибо за вашу помощь. - person HernandoZ; 14.10.2013
comment
Это изменит цвет всего пути? Что делать, если я хочу иметь несколько цветов в одной дорожке Безье? - person nr5; 15.01.2015