Tôi đang triển khai một trò chơi solitaire iOS đơn giản cho phép người dùng kéo thẻ xung quanh theo cách thông thường. Các thẻ được trình bày với các lớp con UIView
CardView
. Tất cả các dạng xem của thẻ là anh chị em, là các phần phụ của SolitaireView
. Đoạn mã sau cố gắng "mang thẻ vào mặt trước" để nó ở trên tất cả các chế độ xem khác khi đang được kéo:UIView bringSubviewToFront: không * không * hiển thị chế độ xem trước
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
if (touch.view.tag == CARD_TAG) {
CardView *cardView = (CardView*) touch.view;
...
[self bringSubviewToFront:cardView];
...
}
}
Thật không may, thứ tự z của thẻ vẫn không thay đổi trong khi kéo. Trong những hình ảnh dưới đây, tôi đang kéo vua. Chú ý nó như thế nào là đúng trên đỉnh Cửu trong hình ảnh bên trái, nhưng là sai dưới Hai (dưới toàn bộ đống trên thực tế) trong hình ảnh bên phải:
Tôi cũng đã cố gắng thay đổi thuộc tính như layer.zPosition
cũng không có kết quả. Làm thế nào tôi có thể mang lại giao diện thẻ ở mặt trước trong khi kéo? Tôi bị hoang mang.
tôi phát hiện ra rằng 'bringSubviewToFront:' gây 'needsLayout' cờ của view được thiết lập. Phương thức 'layoutSubviews' của tôi cũng đang gọi' bringSubviewToFront: 'do đó hoàn nguyên tất cả các lệnh xem z trở về trạng thái ban đầu của chúng! – wcochran
Vậy thì giải pháp cho việc này là gì? Tôi cũng có cùng một loại yêu cầu, từ danh sách thẻ, nếu tôi chọn bất kỳ thẻ đặt hàng ở giữa nào, nó sẽ xuất hiện, sau đó đi lên phía trước. nhưng hoạt ảnh của tôi không hoạt động vì mangSubviewToFront: phương thức – Mrunal
Nếu bạn gắn bó với việc sử dụng các lớp con UIView thì bạn cần đánh dấu thẻ đang được kéo để layoutSubviews có thể đặt nó lên trên cùng. Tôi thực sự chuyển sang sử dụng CALayers như đã đề cập dưới đây. – wcochran