2009-05-05 11 views
9

Tôi đang xây dựng một mạng lưới hình ảnh và tôi bắt đầu ở trên cùng, tạo các đối tượng UIImageView khắp nơi. Bây giờ tôi muốn chúng chồng chéo lên nhau một chút, nhưng những bức ảnh cuối cùng tôi vẽ là những bức ảnh nổi bật nhất. Tôi muốn đặt vị trí z theo chương trình, để những vị trí đầu tiên tôi vẽ sẽ là vị trí đầu tiên trên đầu.Có cách nào thiết lập một số loại chỉ mục z cho vị trí z của các đối tượng UIImageView không?

Trả lời

14

Bạn đã nói bạn đã sử dụng UIImageView. Vẽ một hình ảnh với UIImageView có nghĩa là khởi tạo nó và sau đó thêm nó vào một khung nhìn container.

Bạn không thể sử dụng mã này trong vòng lặp của mình?

[containerView insertSubview:image atIndex:[[containerView subviews] count]] 

Kết quả sẽ là quan điểm bổ sung đầu tiên là trên đỉnh của cái nhìn chồng (tôi đã không thể kiểm tra điều này mặc dù chưa :))

+0

điều gì sẽ xảy ra nếu tất cả đều có cùng một chỉ mục? – Thanks

+1

Vâng, họ không thể kể từ khi thêm một chỉ số att 0 cho một ví dụ, bumps xuống tất cả những người khác trong ngăn xếp. – ullmark

3

Không trực tiếp.

Một giải pháp sẽ cung cấp cho UIViews thuộc tính chỉ mục z; một số nguyên xác định mức độ sâu của bạn. Sau đó, bạn có thể itterate thông qua một NSArray (myArray) chứa UIViews thêm chúng như subviews theo thứ tự chiều sâu.

2

Thực ra, theo như tôi biết, không có thuộc tính vị trí z-index cho điều đó. Bản vẽ trong chế độ xem sử dụng một mô hình vẽ đơn giản.

Bạn có thể đặt logic vào vòng vẽ (ví dụ: vẽ những thứ bạn muốn lên trên cùng) hoặc bạn có thể sử dụng Cocoa Animation, vì không giống như UIImageView, CALayers có chiều sâu (chúng là phép chiếu 2D của không gian 3D). Xem here để tham khảo.

+0

yeah, tôi nghĩ mỗi UIImageView được loại dựa trên một CALayer? – Thanks

+0

Vâng, hãy nghĩ về nó, trong iPhone tất cả các khung nhìn đều được sao lưu. Đào một chút, tôi đã tìm thấy các phương pháp sau trong tài liệu UIImageView: - insertSubview: aboveSubview: - insertSubview: belowSubview: – Hejazzman

19

thay vì sử dụng insertSubiew bạn có thể thử:

- (void)bringSubviewToFront:(UIView *)view 
- (void)sendSubviewToBack:(UIView *)view 
+0

Kỹ thuật này hoạt động tốt trong trường hợp bạn thêm hình ảnh (hoặc chế độ xem khác) theo chương trình và bạn muốn đẩy nó vào nền. Trong trường hợp của tôi, tôi có một vài nhãn được thiết lập trong Trình tạo giao diện, nhưng tôi đang thêm một hình nền có thể kéo dài trong mã. Không sử dụng sendSubviewToBack :, hình nền xuất hiện trên đầu các nhãn. –

1

Bạn thực sự có thể muốn xem xét sử dụng CALayer thay vì nhiều đối tượng UIImageView. Các đối tượng UIImageView là tuyệt vời nhưng đối với bản vẽ cường độ cao, CALayer có trọng lượng nhẹ hơn và hiệu quả hơn (mặc dù nếu bạn cần người dùng tương tác với hình ảnh, đối tượng xem tốt hơn). Nó thực sự phụ thuộc vào những gì bạn đang làm. CALayers có thuộc tính zPosition. Đây là những gì UIKit sử dụng khi nó sắp xếp vị trí của UIView trong ngăn xếp xem.

3

Tôi đã gặp vấn đề tương tự. Tôi cần phần tử con có chỉ số z cao nhất và thấp nhất. Từ thử nghiệm của tôi, tôi phát hiện ra rằng UIKit sắp xếp các phần tử trong thuộc tính phân tích theo vị trí z của chúng. Ví dụ: nếu bạn chụp [self.scrollview subviews] . Phần tử mảng đầu tiên là subview nằm ở phía sau. Phần tử mảng có chỉ mục cao nhất là phần phụ ở phía trước. Nếu bạn sử dụng

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

mảng phụ sẽ được sắp xếp lại tương ứng.

3

Nếu bạn có ref đến xem dưới đây/ở trên, bạn cần thêm chế độ xem phụ bạn có thể sử dụng sau

[self.view insertSubview:<#(UIView *)#> belowSubview:<#(UIView *)#>]; 
[self.view insertSubview:<#(UIView *)#> aboveSubview:<#(UIView *)#>]; 
1
imageView.layer.zPosition = 100; 
6

https://stackoverflow.com/a/4631895/2482283

Bạn có thể sử dụng tài sản của zPosition lớp của chế độ xem (đó là đối tượng CALayer) để thay đổi chỉ mục z của chế độ xem.

theView.layer.zPosition = 1; 

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

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

#import "QuartzCore/QuartzCore.h" 

cách khác (https://stackoverflow.com/a/4663526/2482283), bạn cũng có thể sử dụng phương pháp uiviews:

@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;