2012-07-03 37 views
5

Tôi đang làm việc tại một điều khiển tùy chỉnh trình bày các điều khiển khác nhau. Tôi muốn chắc chắn rằng các xử lý được lựa chọn có một bảng chỉ số Z-chỉ số sau đó những người khác xử lý.Thay đổi tiểu sử NSView theo thứ tự

Có cách nào để hoán đổi thứ tự xem không? Tôi tìm thấy hàm này sortSubviewsUsingFunction:context: nhưng tôi không thể hiểu đây có phải là giải pháp phù hợp hay không.

+0

bạn có thể lặp qua tất cả các bản xem trước và nhận chúng và bạn có thể chèn từng atindex trên chế độ xem ... –

Trả lời

-5

Khi tôi hiểu câu hỏi của bạn, bạn có thể lặp tất cả những gì bạn xem và thêm chúng vào mảng, sau đó bạn có tùy chọn để thêm chúng vào chế độ xem với chỉ mục .. và bạn có các chức năng sau.

[self.view insertSubview:view1 atIndex:2] 
[self.view insertSubview:view1 aboveSubview:0] 
[self.view insertSubview:view1 belowSubview:1] 

sau đó bạn có thể trao đổi đó là thứ tự như bạn cần ..

+4

Có vẻ như OP đã hỏi về 'NSView' s này chỉ dành cho 'UIView's –

-3

Vâng, sortSubviewsUsingFunction:context: có thể làm những gì bạn đang tìm kiếm để làm, tuy nhiên nó có thể là quá mức cần thiết nếu tất cả các bạn muốn là dành cho một đặc biệt xem để ngồi trên đầu trang của những người khác (không có thứ tự). Trong trường hợp đó, bạn nên xem xét phương pháp bringSubviewToFront: của UIView. Bằng cách đó, bạn có thể làm điều gì đó như thế này trong IBAction của bạn để đưa tay cầm lên:

[self.view bringSubviewToFront: handle]; 

Giả sử xử lý đó là một đối tượng/được kế thừa từ UIView. Nếu đây không phải là những gì bạn đang tìm kiếm, thì bằng mọi cách, hãy truy cập sortSubviewsUsingFunction:context:, trong trường hợp đó, bạn sẽ cần thay đổi các thuộc tính thẻ riêng lẻ cho từng chế độ xem phụ và sắp xếp tương ứng.

+0

Tôi đang làm việc trên OSX không phải iOS ... nhưng +1 vì tôi có thể tìm kiếm các chức năng tương tự. – MatterGoal

+0

Ah, trong trường hợp đó, điều này có vẻ hơi khó hiểu, nhưng bạn luôn có thể thêm danh mục để thực hiện những việc sau: http://stackoverflow.com/questions/4236304/os-x-version-of-bringsubviewtofront –

+0

Cảm ơn bạn, Tôi cần phải hiểu nếu giải pháp này, về hiệu suất, thì tốt hơn thì sortSubviewsUsingFunction – MatterGoal

5

Điều này khá đơn giản, bạn có thể sử dụng hàm so sánh 2 bản xem lại để sắp xếp lại chúng. Đây là một giải pháp đơn giản dựa trên thẻ của chế độ xem:

[mainView sortSubviewsUsingFunction:(NSComparisonResult (*)(id, id, void*))compareViews context:nil]; 

... 

NSComparisonResult compareViews(id firstView, id secondView, void *context) { 
    int firstTag = [firstView tag]; 
    int secondTag = [secondView tag]; 

    if (firstTag == secondTag) { 
     return NSOrderedSame; 
    } else { 
     if (firstTag < secondTag) { 
      return NSOrderedAscending; 
     } else { 
      return NSOrderedDescending; 
     } 
    } 
} 
+0

Tôi xin lỗi nhưng tôi không thể hiểu nguyên mẫu của hàm compareViews. Nó có sử dụng kết hợp của Objective-c và C không? – MatterGoal

4

Cocoa đã giới thiệu API mới kể từ OSX 10.10.
Cũng tương tự như iOS, bạn có thể chuyển một chế độ xem khác được hiển thị bên dưới hoặc bên trên.

[self.view addSubview:myView positioned:NSWindowBelow relativeTo:myViewInBackground]; 

Thanh toán documentation; theo kinh nghiệm của tôi, NSWindowBelowNSWindowAbove dường như đã bị đảo ngược.

+1

Bạn sẽ không cần phải sử dụng child.removeFromSuperview() trước cha mẹ.addSubview (con, chỉ mục) để hoán đổi? Và sẽ không thích hợp hơn khi sử dụng sortSubviewsUsingFunction trong lớp NSView? – eonist

+0

Sau một số thử nghiệm. Chỉ cần thêm chế độ xem lại hoạt động tốt. Không cần phải loại bỏ. – eonist

+0

Các tài liệu nói rằng nó đã có từ 10,0 không 10,10. Vì vậy, cũng có thể sử dụng với các mục tiêu dưới 10.10. – Daniel

Các vấn đề liên quan