Как называется UIControlState, чтобы получить значение при создании подкласса UIButton? - PullRequest
3 голосов
/ 04 марта 2012

Я подкласс UIButton.Но мне нужно знать состояние , в котором находится кнопка, чтобы нарисовать цвет кнопки вверх или вниз:

- (void)drawRect:(CGRect)rect{
     if (state==UIControlStateNormal) {
         //draw rect RED
     }
     if (state==UIControlEventTouchDown) 
         //draw rect BLUE
     }
}

Ответы [ 3 ]

5 голосов
/ 04 марта 2012

Вы даже пытались смотреть на документы?

  1. Перейти к Ссылка UIButton
  2. Проверьте свойства
  3. Ничего очевидного
  4. Проверьте, есть ли у UIButton суперкласс
  5. Перейти к Справочник по UIControl - UIButton суперкласс
  6. Проверьте свойства
  7. О, смотрите, есть state свойство

Обновление

Принятый ответ немного неверен и может привести к некоторой досадно трудной ошибке, чтобы отследить.

Заголовок для UIControl объявляет state как

@property(nonatomic,readonly) UIControlState state;                  // could be more than one state (e.g. disabled|selected). synthesized from other flags.

Теперь, глядя вверх, чтобы увидеть, как определяется UIControlState, мы видим

enum {
    UIControlStateNormal       = 0,                       
    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)
    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use
    UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use
};
typedef NSUInteger UIControlState;

Поэтому, поскольку вы имеете дело с битовой маской, вы должны соответствующим образом проверить состояние, например,

if (self.state & UIControlStateNormal) { ... } 

Обновление 2

Это можно сделать, нарисовав изображение, а затем установив изображение в качестве фона, например,

- (void)clicked:(UIButton *)button;
{
    UIGraphicsBeginImageContext(button.frame.size);

    // Draw gradient

    UIImage *gradient = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    [button setBackgroundImage:image forState:UIControlStateNormal];
}
1 голос
/ 04 марта 2012

Поскольку state является свойством, вы можете использовать self.state для доступа к нему.

Обновление:

См. Обновление следующего ответа.

0 голосов
/ 04 марта 2012

Чтобы перерисовать прямоугольник, я сделал это ...

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    myState = 1;
    [self setNeedsDisplay];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    myState = 0;
    [self setNeedsDisplay];
}


- (void)drawRect:(CGRect)rect
{
    // Drawing code
    NSLog(@"drawRect state: %d", self.state);
    NSLog(@"rect %@", NSStringFromCGRect(self.frame));
    c = UIGraphicsGetCurrentContext();

    if (myState==0){
    ///////// plot border /////////////
    CGContextBeginPath(c);
    CGContextSetLineWidth(c, 2.0);
    CGContextMoveToPoint(c, 1, 1);
    CGContextAddLineToPoint(c, 1, 20);
    CGContextAddLineToPoint(c, 299, 20);
    CGContextAddLineToPoint(c, 299, 1);
    CGContextSetRGBFillColor(c, 0.0, 0.0, 1.0, 1.0);
    CGContextFillPath(c);
    CGContextClosePath(c);
    CGContextStrokePath(c);
    }else{
    CGContextBeginPath(c);
    CGContextSetLineWidth(c, 2.0);
    CGContextMoveToPoint(c, 1, 20);
    CGContextAddLineToPoint(c, 1, 40);
    CGContextAddLineToPoint(c, 299, 40);
    CGContextAddLineToPoint(c, 299, 20);
    CGContextSetRGBFillColor(c, 1.0, 0.0, 1.0, 1.0);
    CGContextFillPath(c);
    CGContextClosePath(c);
    CGContextStrokePath(c); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...