การตั้งค่าอัลฟ่าบน UIView จะตั้งค่าอัลฟ่าบนมุมมองย่อยซึ่งไม่ควรเกิดขึ้น


88

ตามเอกสารประกอบสำหรับ 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 ' มีอัลฟ่าบนหน้าจอ (ไม่ทึบแสงอย่างที่คาดไว้)

เป็นเช่นนี้ได้อย่างไรและสามารถทำอะไรได้บ้าง?


บางทีลำดับของการเพิ่มมุมมองย่อยและการตั้งค่าอัลฟ่าก็สำคัญ ลองเล่นกับลำดับต่างๆ
Joride

เพิ่มรหัสทั้งหมดของการสร้าง anotherView :) และนอกจากนี้ผมคิดว่ามันเป็นคำสะกดผิด แต่คุณแน่ใจว่าคุณเริ่มต้นself.myView? และเพิ่มanotherViewดังกล่าวเช่น[self.self addSubview:self.myView];
iPatel

1
เอกสารประกอบถูกต้อง: ซึ่งจะไม่มีผลกับมุมมองย่อยที่ฝังไว้และอัลฟ่าของมุมมองย่อยจะเหมือนกันเสมอ - แต่มุมมองที่แสดงผลจะมีalphaค่าซึ่งเป็นค่าของมุมมองย่อยทั้งหมดalphaคูณ เช่นถ้าอัลฟา subviews 0.8และอัลฟา SuperView ก็คือ1.0แต่คุณเปลี่ยนเป็น0.6อัลฟา subviews 0.8ยังคงเป็นเหมือนกัน ค่าอัลฟาของมุมมองย่อยที่แสดงผลจะเปลี่ยนจาก0.8เป็น0.48เท่านั้น
holex

คำตอบ:


119

ฉันคิดว่านี่เป็นข้อบกพร่องในเอกสาร คุณควรยื่นที่ bugreport.apple.com

ทุกสิ่งที่ฉันสามารถเห็นได้หลังจากการวิจัยสั้น ๆ แสดงให้เห็นว่าสิ่งที่คุณเห็นคือพฤติกรรมของมันเสมอและการทดสอบของฉันเองก็แสดงให้เห็นเช่นกัน

อัลฟาของมุมมองถูกนำไปใช้กับมุมมองย่อยทั้งหมด

บางทีสิ่งที่คุณต้องการคือ[[UIColor blackColor] colorWithAlphaComponent:0.5]แต่ถ้าไม่ใช่คุณจะต้องทำให้มุมมองเป็นพี่น้องกันแทนที่จะเป็นเด็ก


21
+1. FWIW ฉันคิดว่าเอกสารมีเนื้อหาที่ถูกต้องหากไม่ชัดเจนมาก (จนถึงจุดที่ไม่ถูกต้องสำหรับวัตถุประสงค์ในทางปฏิบัติทั้งหมด) อัลฟาของมุมมองย่อยได้รับผลกระทบ แต่ไม่ใช่ค่าอัลฟา นี่เป็นพฤติกรรมเดียวกันสำหรับทรัพย์สินที่ซ่อนอยู่ การตั้งค่ามุมมองย่อยที่ซ่อนไว้ แต่ไม่ได้ทำให้คุณสมบัติที่ซ่อนอยู่ของมุมมองย่อยถูกตั้งค่า
Bjorn Roche

2
ฉันต้องการแสดงมุมมองบางอย่างเช่น uipopover แต่ใน iphone ฉันต้องสร้าง uiviewcontroller ด้วย [[UIColor blackColor] colorWithAlphaComponent: 0.5] ขอบคุณที่มันใช้งานได้
Alok

2
ฉันไม่เชื่อว่าเอกสาร "ถูกต้องตามเนื้อหา" เลย ในโลกแห่งความเป็นจริงผู้พัฒนาจะอ่านเอกสารและเชื่อว่าอัลฟ่าเด็กจะไม่ได้รับผลกระทบ เมื่อในความเป็นจริงผลลัพธ์ที่ผสมจะเหมือนกับว่ามีการแก้ไขอัลฟ่า เป็นเพียงกรณีเอกสารไม่ดี
Womble

43

อย่าตั้งค่าอัลฟาโดยตรงในมุมมองระดับบนสุด แทนที่จะใช้บรรทัดด้านล่างของโค้ดซึ่งจะใช้ความโปร่งใสกับมุมมองหลักโดยไม่ส่งผลกระทบต่อมุมมองย่อย

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


รหัสนี้ใช้ไม่ได้กับ ios และ xcode ล่าสุด ใครมีความคิดที่แตกต่างกัน?
Moxarth

1
ยอดเยี่ยม !! สำหรับการใช้ swift 4: parentView.backgroundColor = UIColor.black.withAlphaComponent (0.5)
Rakesh Yembaram

ทางออกที่ดี
iLearner

27

อย่างรวดเร็ว

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

อัปเดตสำหรับ SWIFT 3

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

2
สิ่งนี้ไม่ได้ตอบคำถามที่ถาม
David Berry

สิ่งนี้ทำให้ฉันมีข้อผิดพลาด: "ค่าของประเภท 'UIColor' ไม่มีสมาชิก 'colorWithAlphaComponent'"
Krivvenz

1
สวัสดี @Krivvenz 'colorWithAlphaComponent' ถูกเปลี่ยนชื่อเป็น 'withAlphaComponent' แล้ว ดูคำตอบที่แก้ไขของฉัน
Nazarii Stadnytskyi

รหัสนี้ไม่ทำงาน เราไม่สามารถเห็นมุมมองแบบพุชเป็นแบบโปร่งใส ใครมีความคิดอื่น ๆ ?
Moxarth

21

การตั้งค่าความทึบของสีพื้นหลังแทนที่จะเป็นอัลฟาจะไม่ส่งผลต่อมุมมองของลูก

  1. เลือกมุมมอง
  2. ไปที่ตัวตรวจสอบแอตทริบิวต์กว่าสีพื้นหลัง
  3. คลิกที่ "อื่น ๆ "
  4. ตั้งค่าความทึบเป็น 30%

หรือจะตั้งค่าตามโปรแกรมก็ได้

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

แค่นั้นแหละ. Happy Coding !!!


มีวิธีใดบ้างในการดำเนินการนี้โดยใช้โปรแกรม
DCIndieDev

@DCIndieDev ขออภัยฉันไม่พบความทึบเป็นสมบัติของ UIView ดังนั้นตั้งค่าโดยสตอรี่บอร์ด
MRizwan33

นี่คือคำตอบที่ยอดเยี่ยม ทำงานได้ดี
Joe Susnick

นี่ควรเป็นคำตอบที่ยอมรับทำงานได้ตามต้องการ ขอบคุณ.
Missa

1
@ MRizwan33 คุณสามารถเข้าถึงคุณสมบัติทึบจาก [UIView] .layer.opacity
Missa

16

หากคุณชอบสตอรี่บอร์ดให้ใส่User Defined Runtime AttributeมุมมองของคุณในIdentity Inspector:

Key Path: backgroundColor, Type: Color, Value:เช่นสีขาวที่มีความทึบ 50%


ตอบโจทย์มาก! ใน Attributes Inspector ฉันตั้งค่าอัลฟ่าของมุมมองเป็นหนึ่ง ใน Identity Inspector ฉันแทรกเส้นทางสำคัญตามด้านบนด้วย Opacity 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 และรหัสของคุณด้วยว่าถูกตั้งค่าเป็นสีดำจากที่อื่นหรือไม่ หวังว่านี่จะช่วยได้
Ankit Kumar Gupta

ฉันแค่ผลักดันมุมมองอื่นจากมุมมองเดียว มุมมองแบบพุชจะปรากฏเป็นแบบโปร่งใสหลังจากรหัสนี้ ฉันใช้มันหลายครั้งก่อนหน้านี้ ง่ายๆเพียงเท่านี้ -> การตั้งค่า * set = [[การตั้งค่าจัดสรร] initWithNibName: @ "การตั้งค่า" มัด: nil] -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: ตั้งค่าภาพเคลื่อนไหว: ใช่];
Moxarth

คุณใช้ xib หรือสตอรี่บอร์ด?
Ankit Kumar Gupta

แต่ตอนนี้ฉันใช้รหัสนี้และใช้งานไม่ได้ มุมมองแบบพุชจะปรากฏเป็นสีทึบแล้วแต่ว่าเราจะให้สีใดและไม่โปร่งใส
Moxarth

5

ใน 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มุมมองเป็น SuperView, anotherViewและmyViewเป็น subview ทั้งในcontainer, anotherViewไม่ได้เป็น subview 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.