2012-07-14 30 views
5

Tôi đang gặp khó khăn với setNeedsDisplay. Tôi nghĩ rằng nó được cho là để kích hoạt các cuộc gọi của drawRect: cho quan điểm mà nó được gọi là và hệ thống phân cấp dưới đây nếu nó nằm trong giới hạn của khung nhìn, nhưng tôi không thấy rằng đó là trường hợp. Đây là thiết lập của tôi:setNeedsDisplay không kích hoạt drawRect trong các bản xem trước như mong đợi

Từ đại biểu ứng dụng, tôi tạo chế độ xem có kích thước là hình vuông bao trùm chủ yếu toàn bộ màn hình bất động sản. Chế độ xem này được gọi là TrollCalendarView. Không có nhiều điều xảy ra với TrollCalendarView ngoại trừ một vòng quay được kích hoạt bởi la bàn.

Có 7 phần phụ của TrollCalendarView được gọi là PlatformView nhằm chứa các đối tượng vẽ 2D được sắp xếp quanh tâm TrollCalendarView trong bố cục 7 mặt. Vì vậy, khi iPad được xoay, 7 lượt xem xoay sao cho chúng luôn được định hướng theo hướng hồng y.

Mỗi trong số PlatformView các bản xem trước chứa 3 phần phụ được gọi là Tower. Mỗi tháp chứa các đối tượng vẽ 2D được triển khai trong drawRect:.

Vì vậy, tóm lại, tôi có TrollCalendarView có trống drawRect: và các bản xem trước PlatformViewPlatformview -> Tháp mà mỗi công cụ có drawRect triển khai. Ngoài ra, Tower nằm trong giới hạn của Platform, và Platform nằm trong giới hạn của TrollCalendarView.

Trong TrollCalendarView Tôi đã thêm trình nhận dạng swipe. Khi tôi vuốt, một thuộc tính được cập nhật và tôi gọi số [self setNeedsDisplay] nhưng không có gì xảy ra. Tôi đã thêm các mục nhập NSLog vào phương thức drawRect: trong mỗi chế độ xem này và chỉ có phương thức TrollCalendarViewdrawRect: được gọi. Trớ trêu thay, đó là chế độ xem có phương pháp drawRect sẽ trống.

Không có tệp xib.

Tôi cần làm gì để đảm bảo phương pháp drawRect trong các bản xem phụ khác được gọi? Có tài liệu nào đó mô tả tất cả các sắc thái có thể ảnh hưởng đến điều này không?

Trả lời

7

Tôi đang gặp khó khăn với setNeedsDisplay. Tôi nghĩ rằng nó được cho là để kích hoạt các cuộc gọi của drawRect cho quan điểm mà nó được gọi và hệ thống phân cấp dưới đây nếu nó nằm trong giới hạn của khung nhìn

Không, đó không phải là trường hợp. Nơi mà bạn có được ý tưởng đó?

-setNeedsDisplay: chỉ áp dụng cho chế độ xem được gửi. Nếu bạn cần vô hiệu hóa các chế độ xem khác, bạn cũng cần phải thêm một số mã để gửi -setNeedsDisplay: cho chúng. Thats tất cả để có nó.

+0

Tôi nhận ý tưởng đó từ các câu trả lời cho các câu hỏi tương tự ngay tại đây trên stackoverflow. Chỉ cần tìm kiếm subview setNeedsDisplay cho mẫu. Có một số. –

+0

Tôi sẽ làm theo đề nghị này trừ khi tôi học theo cách khác. Nó ít nhất là phù hợp với phát hiện của tôi trong thử nghiệm. –

+1

Thật không may có rất nhiều tiếng ồn trên SO và rất nhiều người mù mù. Các câu hỏi bạn đang xem có rất ít phiếu bầu, vì vậy có thể không nhiều người đã xem chúng hoặc có cơ hội sửa chúng. Nếu bạn mới bắt đầu, tài liệu của Apple sẽ đáng tin cậy hơn nhiều. –

5

Tôi nghĩ đây là một tối ưu hóa trong khuôn khổ; nếu các bản xem trước của bạn không cần để vẽ lại, thì đây là cải tiến hiệu suất chính. Nhận ra rằng hầu hết mọi thứ có thể hoạt hình không yêu cầu drawrect (di chuyển, mở rộng, vv).

Nếu bạn biết rằng tất cả các subviews của bạn nên được vẽ lại (và không chỉ đơn giản là di chuyển), sau đó ghi đè setNeedsDisplay trong giao diện chính của bạn và làm như thế này:

-(void) setNeedsDisplay { 
    [self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)]; 
    [super setNeedsDisplay]; 
} 

Tôi đã thử nghiệm này, và nó cũng làm cho tất cả các bản xem lại cũng được vẽ lại. Xin lưu ý rằng bạn sẽ kiếm được điểm nghiệp vụ nếu bạn bằng cách nào đó lọc tiểu sử của mình và đảm bảo bạn chỉ gửi cho các bản xem trước mà thực sự cần vẽ lại ... và thậm chí nhiều hơn nếu bạn có thể tìm ra cách không cần vẽ lại chúng . :-)

+0

Cảm ơn. Tôi sẽ cố gắng làm điều đó. Trong kịch bản của tôi, các phân tích nền tảng 7 sẽ không cần phải vẽ lại. Chính xác hai phần ba trong số 21 tiểu thuyết còn lại sẽ được đảm bảo cần được vẽ lại. Biết được số 21 cần vẽ lại được tính toán hiệu quả trong drawRect và không thể thực hiện hiệu quả hơn ở nơi khác. Chỉ cần tò mò - làm thế nào để khuôn khổ phủ quyết quyết định của tôi (bình luận tối ưu hóa của bạn)? Có vẻ như điều đó đã đánh bại mục đích của việc có setNeedsDisplay ngay từ đầu. –

+0

Không. Không hoạt động. Điều này chỉ nhận được các bản xem trước. Tôi cần các bản xem trước của các bản xem lại đó để được vẽ lại. Tôi đã quyết định làm công việc đi bộ trên cây tại điểm mà tôi cần đặt setNeedsDisplay. Nhờ đề nghị mặc dù. –

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