Препятствование тому, чтобы UITabBar применил градиент к его изображениям значка

Можно сделать новый репозиторий SVN. Экспортируйте свой проект Мерзавца (излагающий в деталях .git файлы). Добавьте его к репозиторию SVN (инициализирующий репозиторий с тем, что Вы имели до сих пор в Мерзавце). Тогда используйте инструкции для импорта репозиториев SVN в новом проекте Мерзавца.

, Но это потеряет Вашу предыдущую историю Мерзавца.

24
задан 31 August 2009 в 01:51
поделиться

2 ответа

Это на удивление сложно, как UITabBar не предоставляет доступ к выбранным / невыбранным изображениям. Это может быть достигнуто с помощью частного API:

@interface UITabBar (ColorExtensions)
- (void)recolorItemsWithColor:(UIColor *)color shadowColor:(UIColor *)shadowColor shadowOffset:(CGSize)shadowOffset shadowBlur:(CGFloat)shadowBlur;
@end

@interface UITabBarItem (Private)
@property(retain, nonatomic) UIImage *selectedImage;
- (void)_updateView;
@end

@implementation UITabBar (ColorExtensions)
- (void)recolorItemsWithColor:(UIColor *)color shadowColor:(UIColor *)shadowColor shadowOffset:(CGSize)shadowOffset shadowBlur:(CGFloat)shadowBlur
{
    CGColorRef cgColor = [color CGColor];
    CGColorRef cgShadowColor = [shadowColor CGColor];
    for (UITabBarItem *item in [self items])
        if ([item respondsToSelector:@selector(selectedImage)] &&
            [item respondsToSelector:@selector(setSelectedImage:)] &&
            [item respondsToSelector:@selector(_updateView)])
        {
            CGRect contextRect;
            contextRect.origin.x = 0.0f;
            contextRect.origin.y = 0.0f;
            contextRect.size = [[item selectedImage] size];
            // Retrieve source image and begin image context
            UIImage *itemImage = [item image];
            CGSize itemImageSize = [itemImage size];
            CGPoint itemImagePosition; 
            itemImagePosition.x = ceilf((contextRect.size.width - itemImageSize.width) / 2);
            itemImagePosition.y = ceilf((contextRect.size.height - itemImageSize.height) / 2);
            UIGraphicsBeginImageContext(contextRect.size);
            CGContextRef c = UIGraphicsGetCurrentContext();
            // Setup shadow
            CGContextSetShadowWithColor(c, shadowOffset, shadowBlur, cgShadowColor);
            // Setup transparency layer and clip to mask
            CGContextBeginTransparencyLayer(c, NULL);
            CGContextScaleCTM(c, 1.0, -1.0);
            CGContextClipToMask(c, CGRectMake(itemImagePosition.x, -itemImagePosition.y, itemImageSize.width, -itemImageSize.height), [itemImage CGImage]);
            // Fill and end the transparency layer
            CGContextSetFillColorWithColor(c, cgColor);
            contextRect.size.height = -contextRect.size.height;
            CGContextFillRect(c, contextRect);
            CGContextEndTransparencyLayer(c);
            // Set selected image and end context
            [item setSelectedImage:UIGraphicsGetImageFromCurrentImageContext()];
            UIGraphicsEndImageContext();
            // Update the view
            [item _updateView];
        }
}
@end

Можно даже создать несколько довольно интересных эффектов:

Red Tab Bar
(источник: booleanmagic.com )

Вполне возможно, что Apple отклонит приложение для этого. Если частный API будет удален в будущем обновлении ОС,
- [UITabBar recolorItemsWithColor: shadowColor: shadowOffset: shadowBlur:] ничего не сделает вместо сбоя.

18
ответ дан 28 November 2019 в 22:53
поделиться

Добавить градиент очень просто, добавьте следующие строки кода:


CGFloat components[8] = {0.0,0.4,1.0,0.2,0.0,0.6,1.0,1.0};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
CGGradientRef colorGradient = CGGradientCreateWithColorComponents(colorSpace, components, NULL, 2);
CGContextDrawLinearGradient(cxt, colorGradient,CGPointZero,CGPointMake(0,contextRect.size.height),0);

Это очень близко к тому, что делает Apple на панели вкладок, но не точно. Чтобы добиться этого, просто добавьте еще две точки/цвета в компоненты и вместо NULL в CGGradientCreateWithColorComponents используйте что-то вроде {0,0.5,0.6,1.0}. На самом деле, все, что вам нужно, это один цвет фона и три точки альфа (при этом часть цвета должна быть все 1, так как вам нужно только затенение при сохранении одного цветового профиля).

Я выложу свой код, если это не ясно... спасибо.

4
ответ дан 28 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: