Могу ли я исчезнуть / оживить оттенок цвета UIToolbar? - PullRequest
10 голосов
/ 21 декабря 2010

Я пытаюсь анимировать свойство tintColor UIToolbar, чтобы изменить его с одного tintColor на другое.

Вот код, который я пытаюсь.К сожалению, изменение происходит немедленно и не исчезает с зеленого на синий.Это странно, потому что я знаю, что Apple выцветает и «пульсирует» на панели инструментов, окрашивая цвета при привязке или при телефонном звонке.Так почему же это не работает?

// set initial tint color  
myBottomToolBar.tintColor = [UIColor colorWithRed:0.15 green:0.95 blue:0.15 alpha:0.6];

//animation stuff  
[UIView beginAnimations:nil context:nil];  
[UIView setAnimationDuration:1.95];  
[UIView setAnimationDelegate:self];        

//thing to animate  
myBottomToolBar.tintColor = [UIColor colorWithRed:0.15 green:0.35 blue:0.45 alpha:0.6];

//animation stuff  
[UIView commitAnimations]; 

Ответы [ 4 ]

3 голосов
/ 12 января 2011

Цвет оттенка не подлежит анимации через общедоступные API.Вы можете обойти это, вручную изменив цвет оттенка на таймере.Вы должны были бы интерполировать промежуточные уровни цвета.

0 голосов
/ 29 мая 2018

Каждый UIView имеет tintAdjustmentMode :

Первое нестандартное значение режима настройки оттенка в представлении иерархия, восходящая и начинающаяся с самого представления.

Когда значение этого свойства затемнено, значение свойства tintColor изменяется для обеспечения затемнения.

Например, если вам нужно затемнить текущий цвет tintColor (dim = серый цвет), просто используйте код ниже:

// Assuming tintAdjustmentMode is set to .automatic
UIView.animate(withDuration: 0.5) {
   yourView.tintAdjustmentMode = .dimmed
}

Это оживит оттенок цвета до серого и затемнит его.

Если вы хотите анимировать tintColor в свой собственный цвет:

// Make sure it is set to normal and not automatic
yourView.tintAdjustmentMode = .normal

UIView.animate(withDuration: 0.5) {
   yourView.tintColor = .black
}
0 голосов
/ 22 марта 2017

NSTimer и его настройка - большая работа для простой анимации. Вот мое решение, использующее диспетчеризацию, я просто увеличиваю и уменьшаю значение UIBarButtonItem, изменяя альфа-значение цвета оттенка:

-(void)animateItemToTargetAlpha:(CGFloat)targetAlpha
{
    static dispatch_source_t timer = nil;
    static CGFloat DURATION = 0.25f;
    static CGFloat FPS = 30.f;
dispatch_source_cancel(timer);
    timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1/FPS * NSEC_PER_SEC,(1ull * NSEC_PER_SEC) / 10);

    CGFloat red, green, blue, __block alpha;
    [self.navigationItem.rightBarButtonItem.tintColor getRed:&red green:&green blue:&blue alpha:&alpha];

    dispatch_source_set_event_handler(timer, ^{
        alpha = targetAlpha == 1.0f ? alpha + (1/(FPS * DURATION)) : alpha - (1/(FPS * DURATION));
        self.navigationItem.rightBarButtonItem.tintColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
        if(alpha >= 1 || alpha  <= 0)
        {
            dispatch_source_cancel(timer);
        }
    });

    dispatch_resume(timer);
}

Линейная кривая может быть немного заметна, но мне интересно сначала попробовать CADisplayLink, прежде чем вносить какие-либо изменения.

0 голосов
/ 25 октября 2011

Для дальнейшего использования, вот мое несколько поспешное решение для анимации оттенка.Я уверен, что есть более умные способы сделать это с категориями и структурой для значений rgb yadda yadda.Я спешил, хорошо?!

UITabBarController подкласс:

@interface BaseNavigationController : UINavigationController
{
    NSTimer *           tintTimer;
    UIColor *           targetColor;
}

-(void)changeTintTo:(UIColor*)color;
-(void)animateTint;

.

-(void)changeTintTo:(UIColor*)color;
{
    targetColor = [color retain];

    [tintTimer invalidate];
    tintTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(animateTint) userInfo:nil repeats:YES];

}

-(void)animateTint;
{
    UIColor * currentColor = self.navigationBar.tintColor;

    CGFloat red, green, blue, alpha;
    [currentColor getRed:&red green:&green blue:&blue alpha:&alpha];

    CGFloat targetRed, targetGreen, targetBlue, targetAlpha;
    [targetColor getRed:&targetRed green:&targetGreen blue:&targetBlue alpha:&targetAlpha];

    CGFloat newRed = red + ((targetRed - red)*.2);

    UIColor * newColor = [UIColor colorWithRed:newRed
                                         green:green + ((targetGreen - green)*.2)
                                          blue:blue + ((targetBlue - blue)*.2) // the .2 adjusts the fade speed
                                         alpha:1.0];

    if(
       (newRed < targetRed && newRed >= targetRed-0.01) || 
       (newRed > targetRed && newRed <= targetRed+0.01)
    )
    {
        newColor = targetColor;
        [targetColor autorelease];
        [tintTimer invalidate];
        tintTimer = nil;
        targetColor = nil;
    }

    self.navigationBar.tintColor = newColor;

}
...