2009-09-17 29 views
23

Tôi có UIView có chứa một hàng các lớp con của UIView. Lớp con đã ghi đè drawRect: và đã đặt contentMode = UIViewContentModeRedraw.Làm cách nào để bắt buộc vẽ lại (drawRect) của một SubView khi nó thay đổi kích thước?

Khi người dùng squashes và kéo dài vùng chứa mẹ là child views squash và stretch. Khi thay đổi hình dạng xảy ra, tôi muốn có drawRect được gọi nhiều lần để thay đổi nội dung của số child views. Cho đến nay tôi đã không thành công. cách chính xác để làm điều này là gì?

Chúc mừng,

Doug

Trả lời

57

Trong Cocoa, bạn hiếm khi (nếu bao giờ) gọi drawRect - bạn chỉ đánh dấu khu vực hoặc xem như cần cập nhật, và nó sẽ được sắp xếp cho vẽ lại. Điều này cho phép vẽ lại cho nhiều lần vô hiệu được thu gọn lại với nhau.

Đối với Cocoa Touch, bạn muốn một trong hai [view setNeedsDisplay], hoặc setNeedsDisplayinRect:(CGRect)

+1

Tôi đã cố gắng thực hiện chính xác điều đó. Không có hiệu lực. Nuthin. Trong lớp con tôi overrode các setTransform: Phương pháp thusly: - (void) setTransform: (CGAffineTransform) newValue { [siêu setTransform: newValue]; [self setNeedsDisplay]; } – dugla

+0

Rõ ràng, tôi bit của mã futzing bây giờ đã setNeedsDisplay bắn đúng cách. – dugla

3

Bạn cần phải gọi [xem setNeedsLayout], điều này sẽ gây ra subviews để nhận drawRect: gọi nếu những thay đổi bố trí. Tuy nhiên, tôi chưa thử nghiệm điều này.

+0

Một số người nói 'setNeedsDisplay', một số nói 'setNeedsLayout' .. Các hàm ý khác nhau ở đây là gì? – Sti

0

Giải pháp này hơi điên rồ, nhưng nó có ý nghĩa logic và có kết quả hình ảnh tuyệt vời. Tôi đang làm việc với một số NSLayoutManager và một số NSTextContainer s, đặt văn bản thành hai cột. Vì tôi đang sử dụng nhiều vùng chứa văn bản (và tôi không chắc chắn mình muốn nhiều UITextView), tôi sẽ ghi đè phương thức draw(rect: CGRect) của MyDrawingView: UIView.

Vấn đề là sử dụng self.contentMode = .redraw vẫn dẫn đến một số trục trặc nhỏ khi xoay vòng - đủ đáng kể để trở thành bộ ngắt kết nối.

Tôi nhận thấy rằng thiết lập contentMode = .left hoặc thậm chí contentMode = .scaleAspectFit gần với những gì tôi muốn, về mặt xoay pixel hoàn hảo. Nhưng rõ ràng, tôi không nhận được cuộc gọi vẽ mà tôi cần.

Vì vậy, tôi đã overrode layoutSubviews(), đã chuyển contentMode thành .scaleAspectFit, được gọi là super.layoutSubviews(), sau đó chuyển lại. : P

override func layoutSubviews() { 
    self.contentMode = .scaleAspectFit 

    super.layoutSubviews() 
    self.contentMode = .redraw 
} 

Đó là ... hoàn hảo.

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