Измените представление UIBarButtonItem, чтобы оно было прозрачным программно - PullRequest
6 голосов
/ 09 января 2012

Мне было трудно заставить это работать, нигде я не видел работающего примера в Интернете.Теперь предлагая награду за это, так как это сводит меня с ума.Это должно быть легко, но, похоже, это не так.

Я бы хотел, чтобы мои кнопки на панели UINavigationBar были полупрозрачными, чтобы они позволяли отображать фон того, что находится на панели UINavigationBar.через.Этот эффект виден во многих приложениях, примеры изображений ниже.Вы можете сделать это, установив пользовательский фон для элемента, что, по-моему, является неприемлемым решением, поскольку требует предварительной подготовки изображений, а также их нельзя адаптировать к переменным кнопкам и т. Д. Они не будут выглядеть как пользовательский интерфейс Apple и я.Не думаю, что есть причина для этого, UIKit уже рисует фон для этих кнопок, нам просто нужно изменить его.Правильное решение использует элементы панели и представления, сгенерированные Apple apis.

UIBarButtonItem не является подклассом UIView.Когда вы создаете его и добавляете его в UINavigationBar, некоторый код где-то в структуре рисует представление для него.Кажется, что методы каркаса сопротивляются всему, что связано с разрешением прозрачности элементов панели, например, свойство tintColor.

Например, это НЕ работает:

 UINavigationItem *item = [[UINavigationItem alloc] init];
 UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:@"SUCKS" style:UIBarButtonItemStyleBordered target:self action:@selector(whatever:)];
editButton.tintColor = [UIColor colorWithWhite:0.4 alpha:0.3];
item.leftBarButtonItem = editButton;

Ничего из того, что я сделаю, не будетUINavigationBar позволяет полупрозрачность для своих элементов бара.Я считаю, что во время выполнения нам нужно:

  1. Получить изображение для элемента панели
  2. Маска для прозрачности
  3. Установить новое изображение для элемента панели

Но я не смог получить изображение во время выполнения или правильно его замаскировать.Как ты это делаешь?

Like This

Ответы [ 5 ]

5 голосов
/ 09 января 2012

Создайте пользовательский интерфейс и нарисуйте полупрозрачный черный прямоугольник в нем и используйте этот вид с initWithCustomView.

см и

В противном случае вам, возможно, придется использовать изображение (png). например черный пиксель png 1x1 с непрозрачностью 30%. Затем можно выполнить initWithImage.

РЕДАКТИРОВАТЬ: у меня был второй подход, работающий с использованием:

buttonThree = [[UIBarButtonItem alloc] initWithTitle:@" sort button " style:UIBarButtonItemStyleBordered target:self action:@selector(sortMethod)];
UIImage *thebgUIimage = [UIImage imageNamed:@"semi.png"];
[buttonThree setBackgroundImage:thebgUIimage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

В результате получается кнопка с прозрачным фоновым изображением, через которое отображается фоновое изображение панели навигации. Однако вам нужно будет создать изображение с закругленными углами, и поэтому вам потребуется изображение для каждой ширины кнопки. Также я нашел эту тему после попытки выше

2 голосов
/ 18 января 2012

Отличный хак - использовать UISegmentedControl с одним сегментом (в качестве кнопки) и установить его оттенок. Посмотрите на http://charles.lescampeurs.org/2011/02/10/tint-color-uibutton-and-uibarbuttonitem. Я лично реализовал это. Не стесняйтесь задавать любые вопросы.

0 голосов
/ 20 января 2012

Я думаю, что ваш ответ здесь: http://sebastiancelis.com/2009/12/21/adding-background-image-uinavigationbar/

0 голосов
/ 15 января 2012

Если вы ориентируетесь на iOS 5, вы можете установить фоновое изображение кнопки.

    [_button setBackgroundImage:@"image" forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

Обратите внимание, что вам нужно установить фоновые изображения для состояния UIControlSateSelected и снова для обоих состояний элемента управления для barMetrics: UIBarMetricsLandscape, если ваше приложение допускает альбомную ориентацию.

Обратите внимание, это функция iOS 5.

0 голосов
/ 15 января 2012

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

...