Làm cách nào để thiết lập chỉ số iPhone UIView z?


252

Tôi muốn di chuyển một chế độ xem lên trên một chế độ xem khác, làm cách nào tôi có thể biết chỉ số z của chế độ xem và cách di chuyển lên trên cùng?

Câu trả lời:


279

UIViewanh chị em được xếp theo thứ tự mà họ được thêm vào giám sát của họ. Các UIViewphương thức và thuộc tính phân cấp có sẵn để quản lý thứ tự xem. Trong 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;

Các khung nhìn anh chị em được sắp xếp trở lại phía trước trong subviewsmảng. Vì vậy, chế độ xem trên cùng sẽ là:

[parentView.subviews lastObject];

và góc nhìn phía dưới sẽ là:

[parentView.subviews objectAtIndex:0];

Giống như Kolin Krewinkel đã nói, [parentView bringSubviewToFront:view]sẽ đưa tầm nhìn lên hàng đầu, nhưng đây chỉ là trường hợp nếu các lượt xem là tất cả anh chị em trong hệ thống phân cấp.


329

Bạn có thể sử dụng thuộc zPositiontính của lớp của khung nhìn (nó là một CALayerđối tượng) để thay đổi chỉ mục z của khung nhìn.

theView.layer.zPosition = 1;

Như Viktor Nordling đã thêm, "các giá trị lớn được đặt lên hàng đầu. Bạn có thể sử dụng bất kỳ giá trị nào bạn muốn, bao gồm các giá trị âm". Giá trị mặc định là 0.

Bạn cần nhập khung QuartzCore để truy cập lớp. Chỉ cần thêm dòng mã này ở đầu tệp thực hiện của bạn.

#import "QuartzCore/QuartzCore.h"

7
Cũng như một người trợ giúp, các giá trị lớn là "trên đỉnh". Bạn có thể sử dụng bất kỳ giá trị nào bạn muốn, bao gồm các giá trị âm.
Viktor Nordling

12
Giải pháp này tốt hơn trong trường hợp bạn muốn quan điểm của mình luôn được đặt lên hàng đầu. Chỉ cần đặt zPocation thành MAXFLOAT
Muhammad Hassan Nasr

27
Tôi mới biết rằng vị trí zP của lớp và trình xử lý đầu vào của UIView, nằm trên hai đơn đặt hàng Z khác nhau. Thật kỳ quặc khi các nhấp chuột của bạn "đi qua"
Stephen J

giám sát của các quan điểm có phải giống nhau để tạo ra zPositioncác tác phẩm không?
Hlung

3
Tôi nhận thấy rằng, mặc dù chế độ xem ở trên cùng, các nhấp chuột đi qua nó đến các đối tượng bên dưới. Điều này nên được coi là một lỗi. Tôi đang cố gắng tìm một cách chung để tránh vấn đề đó, mà không phải vô hiệu hóa rõ ràng các tương tác của người dùng đối với bất kỳ chế độ xem nào xảy ra bên dưới.
Bruce Patin

103

IB và Swift

Với bố cục trôi chảy trong đó màu vàng là màu giám sát và màu đỏ, màu xanh lá cây và màu xanh lam là những phần anh chị em của màu vàng,

lượt xem - lượt xem màu đỏ trên đầu trang

mục tiêu là để di chuyển một khung nhìn phụ (giả sử màu xanh lá cây) lên đầu.

lượt xem - góc nhìn màu xanh lá cây trên đầu

Trong Trình tạo giao diện

Trong Trình tạo giao diện, tất cả những gì bạn cần làm là kéo chế độ xem bạn muốn hiển thị ở trên cùng xuống cuối danh sách trong Tài liệu phác thảo.

thứ tự các khung nhìn trong Interface Builder

Ngoài ra, bạn có thể chọn chế độ xem và sau đó trong menu, hãy vào Trình chỉnh sửa> Sắp xếp> Gửi tới Mặt trận .

Trong Swift

Có một vài cách khác nhau để làm điều này theo chương trình.

Phương pháp 1

yellowView.bringSubviewToFront(greenView)
  • Phương pháp này tương đương với chương trình của câu trả lời IB ở trên.

  • Nó chỉ hoạt động nếu các cuộc phỏng vấn là anh em ruột của nhau.

  • Một mảng của các cuộc phỏng vấn được chứa trong yellowView.subviews. Ở đây, bringSubviewToFrontdi chuyển greenViewtừ chỉ mục 0đến 2. Điều này có thể được quan sát với

      print(yellowView.subviews.indexOf(greenView))

Phương pháp 2

greenView.layer.zPosition = 1
  • Phương pháp này chỉ di chuyển vị trí 3D của lớp cao hơn (gần với người dùng hơn) trên trục z. Vì mặc định là 0dành cho tất cả các chế độ xem khác, kết quả là có greenViewvẻ như nó ở trên cùng. Tuy nhiên, nó vẫn còn ở chỉ số 0của yellowView.subviewsmảng. Tuy nhiên, điều này có thể gây ra một số kết quả không mong muốn, bởi vì những thứ như sự kiện nhấn sẽ vẫn đi đầu tiên đến chế độ xem với số chỉ mục cao nhất. Vì lý do đó, có thể tốt hơn để đi với Phương pháp 1 ở trên.
  • zPositionthể được đặt thành CGFloat.greatestFiniteMagnitude( CGFloat(FLT_MAX)trong các phiên bản cũ hơn của Swift) để đảm bảo rằng nó nằm trên cùng.

cảm ơn vì điều này ... tôi đã dành 8 giờ để cố gắng tìm ra điều này. yellowView.bringSubviewToFront (greenView) hoạt động hoàn hảo.
MizAkita 3/03/2016

Thật thú vị, lượt xem container không tôn trọng điều này! Bạn phải tự di chuyển chúng trong mã, có vẻ như.
Fattie


19

Nếu bạn muốn thực hiện việc này thông qua Trình tạo giao diện của XCode, bạn có thể sử dụng các tùy chọn menu trong Trình chỉnh sửa-> Sắp xếp. Ở đó bạn sẽ tìm thấy "Gửi tới mặt trận", "Gửi tới trở lại", v.v.


Điều gì nếu các tùy chọn từ Sắp xếp bị vô hiệu hóa?
mr5

9

Trong chế độ xem bạn muốn đưa lên đầu ... (nhanh chóng)

superview?.bringSubviewToFront(self)

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

4

Nếu bạn đang sử dụng cocos2d, bạn có thể thấy một vấn đề với [ParentView bringSubviewToFront: view], ít nhất là nó không hoạt động với tôi. Thay vì đưa quan điểm tôi muốn ra phía trước, tôi gửi các quan điểm khác trở lại và điều đó đã tạo ra mánh khóe.

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

2

Chúng tôi có thể sử dụng zPocation trong ios

nếu chúng ta có một khung nhìn có tên salonDetailView, vd:@IBOutlet weak var salonDetailView: UIView!

Trong trường hợp của tôi xem hình ảnh

và có UIView cho GMSMapView, vd:@IBOutlet weak var mapViewUI: GMSMapView!

Để hiển thị View salonDetailView phía trên mapViewUI

sử dụng zPocation như dưới đây

salonDetailView.layer.zPosition = 1

xin vui lòng gửi ảnh và mã trực tiếp ở đây trong câu trả lời của bạn, để giúp OP dễ dàng lấy nó hơn.
skratchi.at

là người mới bắt đầu, StackOverflow sẽ không cho phép tôi làm điều đó xin lỗi. bạn có thể kiểm tra hình ảnh sự cố i.stack.imgur.com/d9Cx3.png
abhijith k

0

Hoặc sử dụng cái này

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

như ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.