Кнопки UIToolbar с UIImage не совсем прозрачные

У меня был этот код навсегда, и он работал, но он начал проявлять раздражающее поведение, как мне кажется, в iOS 6. В SO есть несколько похожих потоков, но я не нашел решения, с которым мне было бы удобно на данный момент. Я нашел обходной путь (см. Ниже), но это не похоже на "правильный" способ сделать это.

Вот тема с той же проблемой, но без ответов.

Когда я использую изображение в качестве UIBarButtonItem и положить его в UIToolbar прямоугольник UIToolbar не совсем прозрачно. Изображения PNG, которые я использую для UIBarButtonItem прозрачны, так что это не проблема. Вот пример:

Экспонат 1

Когда я использую текст вместо изображения в качестве UIBarButtonItem прозрачность работает, как и ожидалось. Как так:

Экспонат 2

Вот код, который работал вечно:

NSMutableArray *buttonItems = [[[NSMutableArray alloc] initWithCapacity: 1] autorelease];
UIImage *printButtonImage = [UIImage imageNamed:@"buttonPrint.png"];
UIToolbar *toolBarButtons = [[[UIToolbar alloc] initWithFrame:CGRectMake( 0, 0, 52.0, 44.01 )] autorelease];
UIBarButtonItem *printButton = [[[UIBarButtonItem alloc] initWithImage:printButtonImage style:UIBarButtonItemStyleBordered target:self action:@selector(printDocument:)] autorelease];
[buttonItems addObject:printButton];

[toolBarButtons setItems:buttonItems animated:YES];

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:toolBarButtons] autorelease];

Согласно предложениям SO, я добавил это непосредственно перед [toolBarButtons setItems...] но это никак не повлияло

toolBarButtons.backgroundColor = [UIColor clearColor];
[toolBarButtons setTranslucent:YES];
[toolBarButtons setOpaque:NO];

Я нашел эту ветку, в которой ответ от jd предоставил обходной путь (отредактированный в соответствии с моими переменными):

const float colorMask[6] = {222, 255, 222, 255, 222, 255};
UIImage *img = [[UIImage alloc] init];
UIImage *maskedImage = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];

[toolBarButtons setBackgroundImage:maskedImage forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

Я также видел несколько решений этой проблемы, которые требуют получить цвет верхней или нижней части navigationController и применяя градиент, но я отказываюсь верить, что нет способа сделать прямоугольник UIToolbar полностью прозрачный, что должно позволить navigationController цвет, чтобы пройти, градиент и все.

Действительно ли применение маскирующего изображения - единственный способ имитировать правильный интерфейс? Разве Apple не предоставила способ просто сделать UIToolbar содержащий прямоугольник полностью прозрачный?

Пока у меня правильное поведение, но я не чувствую, что у меня есть правильное решение. Это похоже на взломать. Кто-нибудь знает лучший способ сделать это?

1 ответ

Решение

Я делаю то же самое в моем приложении. (Это сводит меня с ума, что мы должны принять у себя UIToolbar в UINavigationBar просто потому что UINavigationBar не рендерит UIBarButtonItem's так же, как UIToolbar делает.)

Вот что я делаю, чтобы избежать проблемы, которую вы видите:

toolbar.barStyle = self.navigationController.navigationBar.barStyle;
toolbar.tintColor = self.navigationController.navigationBar.tintColor;

В прошлый раз, когда я проверял, navigationBar.barStyle - это значение, которое иначе не задокументировано в перечислении UIBarStyle... Я думаю, что это было '3'.

Редактировать: досадно, это не работает на iPhone, как это работает на iPad...

Этот подкласс UIToolbar, кажется, работает нормально. Используйте его вместо простого UIToolbar:

@interface NavToolbar : UIToolbar
@end

@implementation NavToolbar
- (void) layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor clearColor];
    self.opaque = NO;
}
- (void) drawRect:(CGRect)rect
{
}
@end

И вот код для демонстрации его использования. Без NavToolbar я вижу проблему, которую вы представили; с NavToolbar он работает как нужно. Протестировано в симуляторе телефона iOS6.

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIToolbar* tb = [[NavToolbar alloc] initWithFrame: CGRectMake(0, 0, 44, 44)];

    UIBarButtonItem* bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target: nil action: nil];

    tb.items = @[bbi];
    tb.barStyle = self.navigationController.navigationBar.barStyle;

    UIBarButtonItem* tbbbi = [[UIBarButtonItem alloc] initWithCustomView: tb];
    tbbbi.width = 44;

    self.navigationItem.rightBarButtonItem = tbbbi;
}
Другие вопросы по тегам