Установка альфы в UIView устанавливает альфа-канал для его подпредставлений, чего не должно происходить


86

Согласно документации для UIVIew @property(nonatomic) CGFloat alpha

Значение этого свойства - число с плавающей запятой в диапазоне от 0,0 до 1,0, где 0,0 представляет собой полностью прозрачный, а 1,0 - полностью непрозрачный. Это значение влияет только на текущее представление и не влияет ни на одно из его встроенных вложенных представлений.

У меня есть представление контейнера, настроенное следующим образом:

self.myView.backgroundColor = [UIColor blackColor];
self.myView.alpha = 0.5;
[self addSubview:self.myView];

А затем добавьте subviews в myView

[myView addSubView anotherView];
anotherView.alpha = 1;
NSLog(@"anotherView alpha = %f",anotherView.alpha); // prints 1.0000 as expected

Но у ' anotherView ' есть альфа - канал на экране (он не непрозрачен, как ожидалось)

Как это может быть и что делать?


Возможно, важен порядок добавления подвидов и установки альфа. Попробуйте поиграть с разными последовательностями.
— Joride 08

Добавьте весь код создания anotherView :), а также я думаю, что это опечатка, но вы уверены, что инициализируете self.myView? и добавить еще один вид , например[self.self addSubview:self.myView];
— iPatel 08

1
действительно, документация верна: это не повлияет на его встроенные подпредставления, а альфа подвидов всегда одинакова, но визуализированные представления имеют alphaзначение, которое является alphaумноженными значениями всех подвидов . например , если подвиды альфа 0.8и альфа в SuperView было 1.0, но изменить его 0.6, то подвиды альфа остается такой же, 0.8. альфа-значение визуализированного подвида изменяется только с 0.8на 0.48.
— holex 05

Ответы:


117

Думаю, это ошибка в документации. Вы должны подать его на bugreport.apple.com.

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

Альфа представления применяется ко всем подпредставлениям.

Возможно, все, что вам нужно, это, [[UIColor blackColor] colorWithAlphaComponent:0.5]но если нет, вам нужно будет сделать представление родным, а не дочерним.


21
+1. FWIW, я думаю, что документы, возможно, верны, хотя и крайне неясны (вплоть до неправильности для всех практических целей). На альфа-канал подвидов влияет, но не на альфа-значение. Я думаю, что это то же самое поведение для скрытого свойства. Установка скрытых скрывает подпредставления, но не приводит к установке свойства скрытых подвидов.
— Бьорн Рош

2
у меня было требование показать представление, что-то вроде uipopover, но в iphone. Мне нужно создать uiviewcontroller с [[UIColor blackColor] colorWithAlphaComponent: 0.5]. Спасибо, что это сработало
— Алок

2
Я вообще не верю, что документы "возможно правильные". В реальном мире разработчики читают документацию и считают, что дочерние альфа-версии не затронуты. Когда, на самом деле, составной результат будет таким, как если бы альфа была изменена. Это просто плохая документация.
— Womble

43

Не устанавливайте альфу непосредственно для родительского представления. Вместо этого используйте следующую строку кода, которая применит прозрачность к родительскому представлению, не затрагивая его дочерние представления.

[parentView setBackgroundColor: [[UIColor clearColor] colorWithAlphaComponent: 0,5]];


этот код не работает с последними версиями ios и xcode. у кого-нибудь есть разные идеи?
— Moxarth

1
Превосходно!! Для быстрого использования 4: parentView.backgroundColor = UIColor.black.withAlphaComponent (0.5)
— Ракеш Йембарам

Отличное решение.
— iLearner 05

27

Быстро

view.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.5)

ОБНОВЛЕНО ДЛЯ SWIFT 3

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)

2
Это не отвечает на заданный вопрос.
— Дэвид Берри

Это дает мне ошибку: «Значение типа 'UIColor' не имеет члена 'colorWithAlphaComponent'».
— Кривенц,

1
Привет, @Krivvenz! 'ColorWithAlphaComponent' переименован в 'withAlphaComponent'. См. Мой отредактированный ответ.
— Назарий Стадницкий

этот код не работает. мы не можем видеть выталкиваемый вид прозрачным. у кого-нибудь есть другая идея?
— Moxarth

21

Установка непрозрачности цвета фона вместо альфа не повлияет на его дочерние представления.

  1. выберите вид.
  2. перейти к инспектору атрибутов, чем цвет фона
  3. нажмите "другие"
  4. установите непрозрачность на 30%

Или вы можете установить программно

var customView:UIView = UIView()
customView.layer.opacity = 0.3

Это оно. Удачного кодирования !!!


Есть ли способ сделать это программно?
— DCIndieDev

@DCIndieDev Извините, я не обнаружил непрозрачность как свойство UIView. Так установлено раскадровкой.
— MRizwan33

Это отличный ответ. Сработало отлично.
— Джо Сусник

Это должен быть принятый ответ. Работал по мере необходимости. Спасибо.
— Missa

1
@ MRizwan33 Вы можете получить доступ к свойству opacity из [your UIView] .layer.opacity
— Missa

16

Если вам нравятся раскадровки, поставьте отметку User Defined Runtime Attributeдля своего представления в Identity Inspector:

Key Path: backgroundColor, Type: Color, Value:Например , белого цвета с непрозрачностью 50%.


Отличный ответ! В инспекторе атрибутов я установил альфа-канал представления равным единице. В Identity Inspector я вставляю ключевой путь, как указано выше, с непрозрачностью 50%. Непрозрачность представления теперь составляет 50%, но непрозрачность вложенных представлений по-прежнему составляет 100%. Я полагаю, что альфа и непрозрачность НЕ одно и то же.
— etayluz

6

Самое простое решение, как обсуждалось, - изменить альфа следующим образом: Обновленная версия для Xcode 8 Swift 3:

yourParentView.backgroundColor = UIColor.black.withAlphaComponent(0.4)

Цель C:

yourParentView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];

См. Документацию разработчика Apple здесь: https://developer.apple.com/reference/uikit/uiview/1622417-alpha


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

Скорее всего, представление позади вашего yourParentView должно быть сплошным черным, пожалуйста, проверьте свою раскадровку на наличие xib, а также свой код, чтобы узнать, установлен ли он на черный откуда-либо еще. Надеюсь, это поможет
— Анкит Кумар Гупта

Я просто выдвигаю другую точку зрения с одной точки зрения. после этого кода нажатое представление будет выглядеть прозрачным. я использовал это много раз раньше. это так просто. -> settings * set = [[размещение настроек] initWithNibName: @ "settings" bundle: nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: установить анимацию: ДА];
— Moxarth

вы используете xib или раскадровку?
— Анкит Кумар Гупта

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

4

В Swift 4.2 и Xcode 10.1

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

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)

@iOS Спасибо, этот мне помог.
— Raghuram

2

Вот немного сложное решение:

UIView *container;
UIView *myView;
UIView *anotherView;

myView.alpha = 0.5;
[container addSubview:myView];

anotherView.alpha = 1;
[container addSubview:anotherView];

Используйте containerпредставление как супервизор, anotherViewи myViewоба являются подпредставлением container, а anotherViewне подпредставлением myView.


2

На данный момент есть только один способ сделать Parent View прозрачным и не помещать никаких дочерних представлений внутри (не помещать какие-либо представления в качестве subview) родительского представления, поместить эти дочерние представления за пределы родительского представления. Чтобы сделать родительский вид прозрачным, вы можете сделать это с помощью раскадровки.

//Transparent the parentView

parentView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.8)

Поместите другое представление за пределы родительского представления. Это будет работать как шарм.


0

См. Описание, выделенное жирным шрифтом, в документации Xcode.

Значение этого свойства - число с плавающей запятой в диапазоне от 0,0 до 1,0, где 0,0 представляет собой полностью прозрачный, а 1,0 - полностью непрозрачный. При изменении значения этого свойства обновляется только альфа-значение текущего представления. Однако прозрачность, обеспечиваемая этим альфа-значением, влияет на все содержимое представления, включая его подпредставления. Например, подпредставление с альфа-значением 1,0, встроенное в родительское представление с альфа-значением 0,5, отображается на экране, как если бы его альфа-значение также было 0,5.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.