Menyetel alfa di UIView menyetel alfa pada subviewnya yang seharusnya tidak terjadi

88

Menurut dokumentasi untuk UIVIew @property(nonatomic) CGFloat alpha

Nilai properti ini adalah angka floating-point dalam kisaran 0,0 hingga 1,0, di mana 0,0 mewakili transparan sepenuhnya dan 1,0 mewakili buram total. Nilai ini hanya mempengaruhi tampilan saat ini dan tidak mempengaruhi subview yang disematkan.

Saya memiliki tampilan kontainer yang dikonfigurasi sebagai berikut:

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

Dan kemudian tambahkan subview ke 'myView'

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

Tapi ' anotherView ' memang memiliki alfa di layar (tidak buram seperti yang diharapkan)

Bagaimana ini bisa terjadi dan apa yang bisa dilakukan?

Avner Barr
sumber
Mungkin urutan penambahan subview dan pengaturan alpha itu penting. Cobalah bermain dengan urutan yang berbeda.
Joride
Tambahkan semua kode pembuatan anotherView :) dan saya pikir itu salah ketik tetapi apakah Anda yakin Anda menginisialisasi self.myView? dan menambahkan tampilan lain seperti[self.self addSubview:self.myView];
iPatel
1
memang, dokumentasinya benar: itu tidak akan mempengaruhi subview yang disematkan dan alpha subview selalu sama - tapi tampilan yang dirender memiliki alphanilai dimana semua alphanilai subview , dikalikan. misalnya jika subview alpha 0.8dan superview alpha 1.0, tetapi Anda mengubahnya menjadi 0.6, subview alpha masih sama , 0.8. nilai alpha subview yang dirender hanya diubah dari 0.8menjadi 0.48.
holex

Jawaban:

119

Saya rasa ini adalah bug dalam dokumentasi. Anda harus mengajukannya di bugreport.apple.com.

Semua yang dapat saya lihat setelah sedikit penelitian singkat menunjukkan apa yang Anda lihat adalah bagaimana ia selalu berperilaku, dan pengujian saya sendiri menunjukkannya juga.

Alfa tampilan diterapkan ke semua sub-tampilan.

Mungkin yang Anda butuhkan hanyalah [[UIColor blackColor] colorWithAlphaComponent:0.5]tetapi jika tidak, Anda perlu menjadikan tampilan ini sebagai saudara, bukan anak.

Abhi Beckert
sumber
21
+1. FWIW, saya pikir dokumennya bisa dibilang benar, jika sangat tidak jelas (sampai salah untuk semua tujuan praktis). Alfa subview terpengaruh, tetapi bukan nilai alfa. Ini adalah perilaku yang sama, menurut saya, untuk properti tersembunyi. Pengaturan tersembunyi menyembunyikan subview, tetapi tidak menyebabkan properti tersembunyi subview diatur.
Bjorn Roche
2
Saya memiliki persyaratan untuk menunjukkan tampilan sesuatu seperti uipopover tetapi di iphone. Saya harus membuat uiviewcontroller dengan [[UIColor blackColor] colorWithAlphaComponent: 0,5]. terima kasih berhasil
Alok
2
Saya tidak percaya dokumen tersebut "bisa dibilang benar" sama sekali. Di dunia nyata, pengembang akan membaca dokumen dan percaya bahwa anak alpha tidak terpengaruh. Padahal, hasil komposisinya seolah-olah alfa telah dimodifikasi. Ini hanya kasus dokumentasi yang buruk.
Womble
43

Jangan setel alfa secara langsung pada tampilan induk. Alih-alih menggunakan baris kode di bawah ini yang akan menerapkan transparansi ke tampilan induk tanpa memengaruhi tampilan turunannya.

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

VM Anooj
sumber
kode ini tidak berfungsi dengan ios dan xcode terbaru. ada yang punya ide berbeda?
Moxarth
1
Luar biasa !! Untuk penggunaan swift 4: parentView.backgroundColor = UIColor.black.withAlphaComponent (0.5)
Rakesh Yembaram
Solusi bagus.
iLearner
27

Dengan cepat

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

DIPERBARUI UNTUK SWIFT 3

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)
Nazarii Stadnytskyi
sumber
2
Ini tidak menjawab pertanyaan yang diajukan.
David Berry
Ini memberi saya kesalahan: "Nilai tipe 'UIColor' tidak memiliki anggota 'colorWithAlphaComponent'".
Krivvenz
1
Halo @Krivvenz, 'colorWithAlphaComponent' telah diganti namanya menjadi 'withAlphaComponent'. Lihat jawaban saya yang diedit.
Nazarii Stadnytskyi
kode ini tidak berfungsi. kami tidak dapat melihat tampilan yang didorong sebagai transparan. apakah ada yang punya ide lain?
Moxarth
21

Menyetel Opasitas warna latar belakang sebagai ganti alfa tidak akan memengaruhi tampilan turunannya.

  1. pilih tampilan.
  2. pergi ke inspektur atribut daripada warna latar belakang
  3. klik "orang lain"
  4. setel opacity menjadi 30%

Atau Anda dapat mengatur dengan programmetically

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

Itu dia. Selamat Coding !!!

MRizwan33
sumber
Apakah ada cara untuk melakukan ini secara terprogram?
DCIndieDev
@DCIndieDev Maaf saya belum menemukan opacity sebagai properti UIView. Jadi diatur oleh storyboard.
MRizwan33
Ini jawaban yang bagus. Bekerja dengan baik.
Joe Susnick
Ini harus menjadi jawaban yang diterima, Bekerja sesuai kebutuhan. Terima kasih.
Missa
1
@ MRizwan33 Anda dapat mengakses properti opacity dari [UIView Anda] .layer.opacity
Missa
16

Jika Anda menyukai Storyboards, berikan pandangan User Defined Runtime AttributeAnda di Identity Inspector:

Key Path: backgroundColor,, misalnya Type: Color, Value:warna putih dengan Opacity 50%.

Ralf Hundewadt
sumber
Jawaban yang bagus! Di Attributes Inspector saya menyetel alfa tampilan menjadi satu. Di Identity Inspector saya menyisipkan jalur kunci seperti di atas dengan Opacity 50%. Opasitas tampilan sekarang adalah 50%, tetapi opasitas subview masih 100%. Saya kira alpha dan opacity BUKAN satu hal yang sama.
etayluz
6

Solusi paling sederhana seperti yang dibahas adalah mengubah alfa sebagai berikut: Versi terbaru untuk Xcode 8 Swift 3 adalah:

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

Tujuan C:

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

Lihat Dokumen Pengembang Apple di sini: https://developer.apple.com/reference/uikit/uiview/1622417-alpha

Ankit Kumar Gupta
sumber
ya saya menerapkan ini, tetapi tampilan tidak menjadi transparan. Saya telah menggunakan kode ini sebelumnya berkali-kali. tapi kali ini tidak berhasil. dan menunjukkan pandangan saya sebagai warna hitam pekat. jadi ada metode alternatif atau telah berubah dengan pembaruan iOS baru?
Moxarth
Kemungkinan besar tampilan di belakang yourParentView Anda harus berwarna hitam pekat, harap periksa storyboard Anda untuk xib dan juga kode Anda apakah itu disetel ke hitam dari tempat lain. Semoga ini bisa membantu
Ankit Kumar Gupta
saya hanya mendorong pandangan lain dari satu pandangan. tampilan yang didorong akan tampak transparan setelah kode ini. Saya telah menggunakannya berkali-kali sebelumnya. itu sesederhana ini. -> pengaturan * set = [[alokasi pengaturan] initWithNibName: @ "pengaturan" bundel: nil]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: set animasi: YES];
Moxarth
apakah Anda menggunakan xib atau storyboard?
Ankit Kumar Gupta
tetapi sekarang saya menggunakan kode ini dan tidak berfungsi. Tampilan yang didorong akan muncul dengan warna solid apapun warna yang telah kita berikan, dan tidak transparan.
Moxarth
5

Di Swift 4.2 dan Xcode 10.1

Jangan menambahkan warna dan nilai alpha melalui storyboard. Hanya pendekatan terprogram yang akan berfungsi dalam kasus ini.

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
iOS
sumber
@iOS Terima kasih, yang ini membantu saya.
Raghuram
2

Berikut ini solusi yang agak rumit:

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

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

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

Gunakan containertampilan sebagai tampilan super, anotherViewdan myViewkeduanya merupakan sub - tampilan container, anotherViewbukan merupakan subview dalam myView.

likid1412
sumber
2

Untuk saat ini hanya ada satu cara membuat Parent View transparan dan tidak meletakkan tampilan anak di dalam (jangan letakkan tampilan apa pun sebagai subview) tampilan induk, letakkan tampilan anak tersebut di luar tampilan induk. Untuk membuat tampilan orang tua transparan, Anda dapat melakukannya melalui storyboard.

//Transparent the parentView

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

Letakkan tampilan lain di luar tampilan induk. Ini akan bekerja seperti pesona.

Purnendu roy
sumber
0

Silakan lihat deskripsi tebal dari dokumentasi Xcode.

Nilai properti ini adalah angka floating-point dalam kisaran 0,0 hingga 1,0, di mana 0,0 mewakili transparan sepenuhnya dan 1,0 mewakili buram total. Mengubah nilai properti ini memperbarui nilai alpha dari tampilan saat ini saja. Namun, transparansi yang diberikan oleh nilai alfa tersebut memengaruhi semua konten tampilan, termasuk subviewnya. Misalnya, subview dengan nilai alfa 1.0 yang disematkan di tampilan induk dengan nilai alfa 0,5, muncul di layar seolah-olah nilai alfa juga 0,5.

Danyun Liu
sumber