วิธีการตั้งค่าดัชนี iPhone UIView z


252

ฉันต้องการเลื่อนมุมมองหนึ่งไปยังอีกมุมมองหนึ่งฉันจะรู้ดัชนี z ของมุมมองได้อย่างไรและจะเลื่อนไปยังมุมมองด้านบนได้อย่างไร

คำตอบ:


279

UIViewพี่น้องจะเรียงซ้อนกันตามลำดับที่เพิ่มเข้าในการควบคุมของพวกเขา UIViewวิธีการลำดับชั้นและคุณสมบัติจะมีการจัดการเพื่อมุมมอง ใน UIView.h:

@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;

- (void)removeFromSuperview;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;

- (void)addSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;

- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;

มุมมองพี่น้องถูกสั่งซื้อกลับไปด้านหน้าในsubviewsอาร์เรย์ ดังนั้นมุมมองสูงสุดจะเป็น:

[parentView.subviews lastObject];

และมุมมองด้านล่างจะเป็น:

[parentView.subviews objectAtIndex:0];

ดังที่ Kolin Krewinkel กล่าวว่า[parentView bringSubviewToFront:view]จะนำมุมมองไปสู่ด้านบน แต่นี่เป็นเพียงกรณีที่มุมมองนั้นเป็นพี่น้องกันทั้งหมดในลำดับชั้น


329

คุณสามารถใช้zPositionคุณสมบัติของเลเยอร์ของมุมมอง (เป็นCALayerวัตถุ) เพื่อเปลี่ยนดัชนี z ของมุมมอง

theView.layer.zPosition = 1;

ดังที่Viktor Nordling ได้เพิ่ม "ค่าใหญ่อยู่ด้านบนคุณสามารถใช้ค่าใดก็ได้ที่คุณต้องการรวมถึงค่าลบ" ค่าเริ่มต้นคือ 0

คุณต้องนำเข้า QuartzCore framework เพื่อเข้าถึงเลเยอร์ เพียงเพิ่มรหัสบรรทัดนี้ที่ด้านบนของไฟล์การใช้งานของคุณ

#import "QuartzCore/QuartzCore.h"

7
ในฐานะผู้ช่วยค่ายิ่งใหญ่ก็คือ "ด้านบน" คุณสามารถใช้ค่าใดก็ได้ที่คุณต้องการรวมถึงค่าลบ
Viktor Nordling

12
วิธีนี้ดีกว่าในกรณีที่คุณต้องการให้มุมมองของคุณอยู่ด้านบนเสมอ เพียงตั้งค่า zPosition เป็น MAXFLOAT
Muhammad Hassan Nasr

27
ฉันเพิ่งเรียนรู้ว่า zPosition ของเลเยอร์และตัวจัดการอินพุตของ UIView นั้นอยู่ในคำสั่ง Z สองคำสั่งที่ต่างกัน มันแปลกจริงๆเมื่อการคลิกของคุณ "ผ่าน"
สตีเฟ่น J

มุมมองของผู้ดูแลจะต้องเหมือนกันในการzPositionทำงานหรือไม่
Hlung

3
ฉันสังเกตเห็นว่าแม้ว่ามุมมองจะอยู่ด้านบน แต่การคลิกผ่านไปยังวัตถุที่อยู่ด้านล่าง นี่ควรจะถือว่าเป็นข้อผิดพลาด ฉันกำลังพยายามหาวิธีทั่วไปในการหลีกเลี่ยงปัญหานั้นโดยไม่ต้องปิดใช้งานการโต้ตอบของผู้ใช้อย่างชัดเจนในมุมมองใด ๆ ที่เกิดขึ้นภายใต้
Bruce Patin

103

IB และ Swift

เมื่อกำหนดเลย์เอาท์ที่สีเหลืองเป็นตัวควบคุมและสีแดงสีเขียวและสีน้ำเงินเป็นภาพย่อยของพี่น้องที่เป็นสีเหลือง

views - มุมมองสีแดงอยู่ด้านบน

เป้าหมายคือการย้ายมุมมองย่อย (สมมติว่าสีเขียว) ขึ้นไปด้านบน

views - มุมมองสีเขียวด้านบน

ในเครื่องมือสร้างส่วนต่อประสาน

ในเครื่องมือสร้างอินเทอร์เฟซสิ่งที่คุณต้องทำคือการลากมุมมองที่คุณต้องการให้แสดงที่ด้านบนไปด้านล่างของรายการในเค้าร่างเอกสาร

ลำดับของมุมมองในเครื่องมือสร้างอินเตอร์เฟส

หรือคุณสามารถเลือกมุมมองและจากนั้นในเมนูไปEditor> จัด> ส่งไปด้านหน้า

ในสวิฟท์

มีสองวิธีที่แตกต่างกันในการทำสิ่งนี้โดยทางโปรแกรม

วิธีที่ 1

yellowView.bringSubviewToFront(greenView)
  • วิธีนี้เทียบเท่ากับคำตอบจากโปรแกรม IB ข้างต้น

  • ใช้งานได้เฉพาะเมื่อการสัมภาษณ์ย่อยเป็นพี่น้องกัน

  • อาร์เรย์ของ subviews yellowView.subviewsที่มีอยู่ใน นี่bringSubviewToFrontย้ายgreenViewจากดัชนีการ0 2ซึ่งสามารถสังเกตได้ด้วย

      print(yellowView.subviews.indexOf(greenView))

วิธีที่ 2

greenView.layer.zPosition = 1
  • วิธีนี้จะย้ายตำแหน่ง 3D ของเลเยอร์ที่สูงขึ้น (ใกล้ชิดกับผู้ใช้) บนแกน z เนื่องจากค่าเริ่มต้น0สำหรับทุกมุมมองอื่น ๆ ผลลัพธ์ก็คือgreenViewหน้าตามันจะอยู่ด้านบน อย่างไรก็ตามมันยังคงอยู่ที่ดัชนี0ของyellowView.subviewsอาร์เรย์ สิ่งนี้อาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิดได้เนื่องจากสิ่งต่าง ๆ เช่นเหตุการณ์การแตะจะยังคงอยู่ก่อนเพื่อดูด้วยหมายเลขดัชนีสูงสุด ด้วยเหตุผลดังกล่าวการเลือกวิธีที่ 1 ด้านบนอาจดีกว่า
  • zPositionอาจจะกำหนดให้CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)ในรุ่นเก่าของสวิฟท์) เพื่อให้แน่ใจว่ามันอยู่ด้านบน

ขอบคุณสำหรับสิ่งนี้ ... ฉันใช้เวลา 8 ชั่วโมงในการพยายามคิดออก yellowView.bringSubviewToFront (greenView) ทำงานได้อย่างสมบูรณ์แบบ
MizAkita

ที่น่าสนใจคือมุมมองคอนเทนเนอร์ไม่เคารพสิ่งนี้! คุณต้องย้ายพวกเขาด้วยตนเองในรหัสดูเหมือนว่า
Fattie


19

หากคุณต้องการทำสิ่งนี้ผ่านตัวสร้างอินเตอร์เฟสของ XCode คุณสามารถใช้ตัวเลือกเมนูในตัวแก้ไข -> การจัดเรียง คุณจะพบ "ส่งไปที่หน้า", "ส่งไปด้านหลัง" เป็นต้น


จะทำอย่างไรถ้าตัวเลือกจาก Arrange ถูกปิดใช้งาน
mr5

9

ภายในมุมมองที่คุณต้องการนำขึ้นไปด้านบน ... (อย่างรวดเร็ว)

superview?.bringSubviewToFront(self)

btnDOWN.superview? .bringSubview (toFront: btnDOWN)
Criss

4

หากคุณใช้ cocos2d คุณอาจพบปัญหากับ [parentView bringSubviewToFront: view] อย่างน้อยมันก็ไม่ทำงานสำหรับฉัน แทนที่จะส่งมุมมองที่ฉันต้องการไปด้านหน้าฉันส่งมุมมองอื่นกลับคืนมาและนั่นก็เป็นกลอุบาย

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 

2

เราสามารถใช้ zPosition ใน iOS ได้

ถ้าเรามีมุมมองชื่อsalonDetailView เช่น:@IBOutlet weak var salonDetailView: UIView!

ในกรณีของฉันเห็นภาพ

และมี UIView สำหรับGMSMapView เช่น:@IBOutlet weak var mapViewUI: GMSMapView!

เพื่อแสดงมุมมองSalonDetailViewด้านบนของmapViewUI

ใช้ zPosition ดังนี้

salonDetailView.layer.zPosition = 1

โปรดโพสต์รูปถ่ายและรหัสโดยตรงที่นี่ในคำตอบของคุณเพื่อให้ OP ได้ง่ายขึ้น
skratchi.at

ในฐานะผู้เริ่มต้น StackOverflow จะไม่อนุญาตให้ฉันทำอย่างนั้นเสียใจ คุณสามารถตรวจสอบภาพปัญหาi.stack.imgur.com/d9Cx3.png
abhijith k

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