Альфа-проблема UIView

У меня проблемы с установкой альфа-значения объекта подкласса UIView. Какие-либо предложения?

У меня есть проект UIView, альфа-свойство которого я использую для управления яркостью. Я использую элемент управления UISlider, чтобы установить значение свойства alpha в подклассе UIView следующим образом:

-(id)initWithFrame:(CGRect)rect andParent:(id)theParent {

self = [super initWithFrame: rect];

if (self !=nil) {

    [self setParent:theParent];

    theSlider = [[UISlider alloc] initWithFrame: CGRectMake(35.0,400.0,250,0)];
    theSlider.minimumValue = 0.2;
    theSlider.maximumValue = 1.0;
    theSlider.value = 1.0;
    theSlider.continuous = YES;

    UIImage *maximumValueImage = [UIImage imageNamed:@"BrightSun.png"];
    UIImage *minimumValueImage = [UIImage imageNamed:@"DimSun.png"];

    theSlider.maximumValueImage = maximumValueImage;
    theSlider.minimumValueImage = minimumValueImage;

    theSlider.hidden = NO;
    [theSlider addTarget:parent action: @selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];

    [self addSubview:theSlider];

}

return self;
}

Метод sliderValueChanged в родительском объекте изменяет альфа-значение другого объекта подкласса UIView, OverlayView. Родительский объект является подклассом UIViewController, myViewController. Ползунок находится во втором подклассе UIView с именем SliderView.

- (void) sliderValueChanged: (id)sender { 
    //min = 0.2 
    //max = 1.0 
    UISlider *control = (UISlider *)sender; 
    float theValue = control.value; 
    theValue = -1.0 * (theValue - 1.0) + 0.01; 
    self.overlayView.alpha = theValue; 
}

Кажется, это работает. Проблема возникает, когда я пытаюсь переключить свойство .hidden UISlider. Когда я изменяю свойство .hidden на YES,

theSlider.hidden = YES;

Ползунок исчезает, но альфа-значение объекта OverlayView сбрасывается до 0,0. Значение ползунка не меняется. Я хочу, чтобы альфа-свойство OverlayView, заданное методом
sliderValueChanged, оставалось неизменным при изменении скрытого свойства объекта UISlider.

Любые предложения относительно того, что я делаю неправильно? Спасибо.


person Community    schedule 13.07.2009    source источник


Ответы (2)


Что ж, сначала начните с добавления точки останова, чтобы увидеть, вызывается ли метод sliderValueChanged:, когда вы скрываете свой ползунок, что, похоже, имеет место, когда значение ползунка сбрасывается до 0, когда вы его скрываете. (кажется, что происходит, хотя это предположение, но я не могу сказать, не глядя и не просматривая код). Если то, что я упомянул, имеет место, просто укажите условие в методе (if(!slider.HIDDEN)

person Daniel    schedule 13.07.2009
comment
Спасибо. Я уже дал, что я пытаюсь. Метод sliderValueChanged: работает, как и ожидалось. Ползунок сохраняет свое значение. sliderValueChanged: очень просто. - (void) sliderValueChanged: (id)sender { //мин. = 0,2 //макс. = 1,0 UISlider *control = (UISlider *)sender; float theValue = control.value; значение = -1,0 * (значение - 1,0) + 0,01; self.overlayView.alpha = значение; } Обратите внимание: код работает, как и ожидалось, при запуске в симуляторе iPhone. Проблема материализуется при выполнении на устройстве. - person ; 13.07.2009

Обновление. Я внес изменения в класс OverlayView. OverlayView является подклассом UIView. Я переопределил метод drawRect:(CGRect)rect следующим образом:

-(void)drawRect:(CGRect)rect {
    [super drawRect:rect];
}

Теперь все работает. Я понятия не имею, почему это решает проблему. Является ли drawRect: не вызванным подклассами UIView, если это специально не переопределено?

person Community    schedule 13.07.2009
comment
Если это то, что решило ваш ответ, отметьте его как ответ (можно ответить на свой собственный вопрос). - person Sam; 13.09.2011