Установка альфы в 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

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

MRizwan33
источник
Есть ли способ сделать это программно?
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
источник
@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.

likid1412
источник
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.

Данюн Лю
источник