Встановлення альфа-версії для 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];

А потім додайте підпрограми до "myView"

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

Але у ' anotherView ' є альфа-екран (він не є непрозорим, як очікувалося)

Як це може бути і що можна зробити?


Можливо, важливим є порядок додавання підпрограм та встановлення альфа-версії. Спробуйте грати з різними послідовностями.
Джоріде

Додайте весь код створення anotherView :), а також я думаю, що це друкарська помилка, але ви впевнені, що ініціалізуєте self.myView? і додати ще один Переглянути такий, як[self.self addSubview:self.myView];
iPatel

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

Відповіді:


117

Я думаю, що це помилка в документації. Ви повинні подати його на bugreport.apple.com.

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

Альфа-вигляд застосовується до всіх підпрограм.

Можливо, все, що вам потрібно, [[UIColor blackColor] colorWithAlphaComponent:0.5]але якщо ні, то вам потрібно буде зробити вигляд рідним братом, а не дитиною.


21
+1. FWIW, я думаю, що документи є безперечно правильними, якщо вкрай незрозумілими (настільки, що вони є неправильними для всіх практичних цілей). Це впливає на альфа-підпрограми, але не на альфа-значення. Я думаю, це однакова поведінка щодо прихованого майна. Налаштування прихованих приховує підпрогляди, але не спричиняє встановлення прихованої властивості підпоглядів.
Бьорн Рош

2
у мене була вимога показати подання, наприклад, uipopover, але в iphone. Мені потрібно створити контролер uiview з [[UIColor blackColor] colorWithAlphaComponent: 0.5]. дякую, це спрацювало
Alok,

2
Я взагалі не вірю в те, що документи є "безперечно правильними". У реальному світі розробники читатимуть документи та вважатимуть, що дочірні альфа-файли це не впливає. Коли, насправді, складений результат буде таким, ніби альфа-модифіковані. Це просто випадок поганої документації.
Womble

43

Не встановлюйте альфу безпосередньо на батьківському поданні. Замість нього використовуйте наведений нижче рядок коду, який застосовуватиме прозорість до батьківського перегляду, не впливаючи на його дочірні погляди.

[parentView setBackgroundColor: [[UIColor clearColor] colorWithAlphaComponent: 0.5]];


цей код не працює з останніми ios та xcode. хтось має різні ідеї?
Моксарт,

1
Відмінно !! Для швидкого використання 4: parentView.backgroundColor = UIColor.black.withAlphaComponent (0.5)
Ракеш Ємбарам

Чудове рішення.
iLearner

27

Швидко

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

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

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

2
Це не стосується поставленого питання.
Девід Беррі,

Це призводить до помилки: "Значення типу 'UIColor' не має члена 'colorWithAlphaComponent'".
Krivvenz

1
Привіт @Krivvenz, 'colorWithAlphaComponent' було перейменовано на 'withAlphaComponent'. Дивіться мою відредаговану відповідь.
Назарій Стадницький

цей код не працює. ми не можемо бачити просунутий вигляд як прозорий. хтось мав якусь іншу ідею?
Моксарт,

21

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

  1. виберіть вид.
  2. перейдіть до інспектора атрибутів, ніж колір фону
  3. натисніть "інші"
  4. встановіть непрозорість на 30%

Або ви можете встановити програмно

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

Це воно. Щасливого кодування !!!


Чи є якийсь спосіб зробити це програмно?
DCIndieDev

@DCIndieDev На жаль, я не знайшов непрозорість як властивість UIView. Так встановлено розкадровкою.
MRizwan33

Це чудова відповідь. Працював чудово.
Джо Суснік,

Це має бути прийнятою відповіддю. Працював за потреби. Дякую.
Місса,

1
@ MRizwan33 Ви можете отримати доступ до властивості непрозорості з [вашого UIView] .layer.opacity
Місса

16

Якщо вам подобаються Раскадровки, поставте User Defined Runtime Attributeдля свого перегляду Identity Inspector:

Key Path: backgroundColor, Type: Color, Value:Наприклад , білого кольору з непрозорістю 50%.


Чудова відповідь! В Інспекторі атрибутів я встановив альфа-версію подання на одиницю. В інспекторі посвідчень я вставляю шлях ключа, як зазначено вище, із непрозорістю 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?
Моксарт,

Швидше за все, вигляд за вашимParentView повинен бути суцільно чорним, будь ласка, перевірте свою розкадрування на наявність xib, а також свій код, чи встановлено він чорним з будь-якого іншого місця. Сподіваюся, це допоможе
Анкіт Кумар Гупта,

я просто штовхаю інший погляд з одного виду. висунутий вигляд буде виглядати прозорим після цього коду. я використовував це багато разів раніше. це так просто. -> settings * set = [[settings alloc] initWithNibName: @ "settings" bundle: nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: встановити анімацію: ТАК];
Моксарт,

ви використовуєте xib або раскадровку?
Анкіт Кумар Гупта,

але зараз я використовую цей код, і він не працює. висунутий вигляд відображатиметься суцільним кольором, який би ми не дали, та не прозорим.
Моксарт,

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

На даний момент існує лише один спосіб зробити батьківський подання прозорим і не поміщати дочірні подання всередину (не розміщувати жодних подань як підпогляд) батьківського подання, а дочірні подання за межами батьківського подання. Щоб зробити батьківський вигляд прозорим, ви можете зробити це за допомогою розкадрування.

//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.