Разве UIToolBar не может быть прозрачным? - PullRequest
22 голосов
/ 18 марта 2010

Я пробую следующий код, но он не работает.

[helloToolbar setBackgroundColor:[UIColor clearColor]];

Ответы [ 12 ]

57 голосов
/ 15 июля 2010

Чтобы сделать полностью прозрачную панель инструментов, используйте метод , описанный здесь .Одним словом, создайте новый класс TransparentToolbar, который наследуется от UIToolbar, и используйте его вместо UIToolbar.

TransarentToolbar.h

@interface TransparentToolbar : UIToolbar
@end

TransarentToolbar.m

@implementation TransparentToolbar

// Override draw rect to avoid
// background coloring
- (void)drawRect:(CGRect)rect {
    // do nothing in here
}

// Set properties to make background
// translucent.
- (void) applyTranslucentBackground
{
    self.backgroundColor = [UIColor clearColor];
    self.opaque = NO;
    self.translucent = YES;
}

// Override init.
- (id) init
{
    self = [super init];
    [self applyTranslucentBackground];
    return self;
}

// Override initWithFrame.
- (id) initWithFrame:(CGRect) frame
{
    self = [super initWithFrame:frame];
    [self applyTranslucentBackground];
    return self;
}

@end

(код из поста в блоге, который указан выше)

25 голосов
/ 30 марта 2012

В iOS 5 просто вызовите setBackgroundImage и передайте прозрачное изображение.

Вот как я это делаю (я динамически генерирую прозрачное изображение):

CGRect rect = CGRectMake(0, 0, 1, 1);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
CGContextFillRect(context, rect);
UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[toolbar setBackgroundImage:transparentImage forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
16 голосов
/ 20 марта 2010

Лучшее, что вы можете сделать, это использовать

[helloToolbar setBarStyle:UIBarStyleBlack];
[helloToolbar setTranslucent:YES];

Это даст вам черную, но полупрозрачную панель инструментов.

14 голосов
/ 03 сентября 2012

Прозрачный (iOS 5.0):

[toolbar setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

Полупрозрачная:

[toolbar setBarStyle:UIBarStyleBlack];
[toolbar setTranslucent:YES];
7 голосов
/ 18 декабря 2012

Накопительное решение для всех устройств, от самой старой iOS 3.0 (iPhone 1) до новейшей iOS 6.1 (iPad mini).

@implementation UIToolbar (Extension)

- (void)drawRect:(CGRect)rect
{
    if (CGColorGetAlpha(self.backgroundColor.CGColor) > 0.f)
    {
        [super drawRect:rect];
    }
}

- (void)setTransparent
{
    //iOS3+
    self.backgroundColor = [UIColor clearColor];

    //iOS5+
    if ([self respondsToSelector:@selector(setBackgroundImage:forToolbarPosition:barMetrics:)])
    {
        [self setBackgroundImage:[[UIImage new] autorelease] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
    }
    //iOS6+
    if ([self respondsToSelector:@selector(setShadowImage:forToolbarPosition:)])
    {
        [self setShadowImage:[[UIImage new] autorelease] forToolbarPosition:UIToolbarPositionAny];
    }
}

@end

Если вам нужна прозрачная панель инструментов, наберите на ней setTransparent. Если вам нужна непрозрачная панель инструментов, установите backgroundColor на ваш выбор или добавьте imageView самостоятельно.

6 голосов
/ 06 декабря 2010

Другим решением будет определение категории для UIToolbar:

@implementation UIToolbar(Transparent) 
-(void)drawRect:(CGRect)rect {
    // do nothing in here
}
@end

В IB установите панель инструментов как Черная полупрозрачная и непрозрачная.

2 голосов
/ 24 декабря 2011

С iOS 5 работает:

UIToolbar *bar = [[UIToolbar alloc] initWithFrame:CGRectZero];
if (bar.subviews.count > 0)
     [[[bar subviews] objectAtIndex:0] removeFromSuperview];

Это потому, что фон теперь является подпредставлением. Этот код безопасен даже с новыми версиями iOS, , но может перестать работать. Это не частное использование API, ваше приложение безопасно отправлять в магазин.

Убедитесь, что вы удалили backgroundView перед добавлением любых UIBarButtonItem s на панель. Или мой код не будет работать.

2 голосов
/ 21 апреля 2011

Мы только что заметили, что переопределение drawRect больше не работает с iOS 4.3. Он больше не называется (правка: похоже, только в симуляторе). Вместо этого вызывается drawLayer: inContext:.

Отличное решение было опубликовано здесь

Теперь вы можете установить прозрачность каждого объекта UIToolbar, установив для его tintColor значение [UIColor clearColor]:)

1 голос
/ 08 мая 2012

Это работает в iOS5.1 с довольно минимальными усилиями. Я сопоставляю размер, так как только фон будет иметь такой же размер кадра, как и сама панель инструментов. Конечно, вы можете использовать и другие критерии.

Наслаждайтесь.

Создайте подкласс UIToolbar следующим образом:

.h:

#import <UIKit/UIKit.h>

@interface UIClearToolbar : UIToolbar

@end

.m:

#import "UIClearToolbar.h"

@implementation UIClearToolbar

- (void)layoutSubviews {
    // super has already laid out the subviews before this call is made.
    [self.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
        if (CGSizeEqualToSize(self.frame.size, obj.frame.size) ||
        self.frame.size.width <= obj.frame.size.width) {  // on device, the background is BIGGER than the toolbar.) {
            [obj removeFromSuperview];
            *stop = YES;
        }
    }];
}

@end
1 голос
/ 09 сентября 2011
toolbar.barStyle = UIBarStyleBlackTranslucent;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...