2012-10-17 46 views
6

Ứng dụng của tôi có thể vẽ một số hình đơn giản (cho đến khi tôi nhận được mã ổn định hơn, tôi chỉ dán một hình) và nó cũng có thể tái kích thước chúng. Mã tôi sử dụng để tạo ra một UIView như sau:UIView Vẽ thực tiễn tốt nhất

- (void)drawRect:(CGRect)rect 
{  
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    [self setContextFillColor:context]; 
    [self setContextStrokeColor:context]; 
    [self setLineWidth:context]; 

    CGFloat lineThickness = [self lineWidth] ; 
    CGFloat halfLineThickess = lineThickness/2.0f; 

    CGContextAddRect(context, CGRectMake(halfLineThickess,halfLineThickess, rect.size.width - lineThickness, rect.size.height - lineThickness)); 

    CGContextDrawPath(context, kCGPathEOFillStroke); 
} 

nào mang lại cho tôi, với kích thước đầu vào của (100.0f, 100.0f), điều này:

enter image description here

Con số này là bên trong "vùng chứa" UIView mà lần lượt nằm trong một số UIScrollView. Vấn đề của tôi với điều này là khi tôi định lại kích thước của mình và tôi đạt đến kích thước khoảng 1000 * 1000 ("container" của tôi là 20.000 * 20.000), tôi bắt đầu nhận được cảnh báo bộ nhớ và ứng dụng cuối cùng đã từ bỏ. Vì vậy, câu hỏi của tôi là:

1) Tôi có nên cân nhắc đặt kích thước tối đa cho UIView không?

2) Làm cách nào tôi có thể sử dụng các công cụ để theo dõi loại vấn đề này và xem nơi xảy ra sự cố (hoặc việc nâng hạng nặng).

3) Tôi có nên sử dụng một số loại bộ nhớ đệm như this không?

4) Có một số phương pháp hay nhất thực hành tốt nhất để xem xét khi vẽ một hình ảnh UIView?

5) Tôi có nên xem xét CALayer, mặc dù tôi cần phải nghe chạm không?

Việc định lại kích thước của UIView chủ yếu dựa trên this.

+0

Bạn đã cân nhắc sử dụng QuartzCore và chỉ sử dụng thuộc tính lớp của chế độ xem của bạn để vẽ đường viền? – runmad

+0

Vấn đề là: đây là một hình đơn giản. Cuối cùng tôi sẽ có những người phức tạp hơn, và tôi không nghĩ rằng chơi xung quanh với các thuộc tính của 'UIView' là đủ. Nhưng cảm ơn đề nghị. – Peres

+2

nếu bạn cần vẽ nội dung lớn (có thể với thu phóng), bạn có thể muốn kiểm tra 'CATiledLayer' http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html – Bastian

Trả lời

1

Bạn không nên tạo UIView lớn này. Nó quá lớn. Loại vấn đề này là gì CATiledLayer được thiết kế để giải quyết. Về cơ bản bạn sẽ cần phải theo dõi các hộp giới hạn cho các hình dạng của bạn và sử dụng các hộp giới hạn đó để tìm ra các ô giao nhau với hình dạng nào. Khi hệ thống yêu cầu một ô đã cho, thì bạn vẽ tất cả các hình dạng giao nhau. Đối với các hình dạng rất lớn và phức tạp, bạn có thể tối ưu hóa thêm bằng cách chia nhỏ hình dạng nhưng thường không cần thiết.

1

1) Tôi nghĩ rằng kích thước đó không phải là vấn đề nếu bạn đang sử dụng đúng cách tiếp cận.

2) Bạn nên sử dụng dụng cụ hãy xem video WWDC về việc theo dõi các vấn đề bộ nhớ

3,4) Tôi nghĩ rằng - (void)drawRect:(CGRect)rect nó không phải là một thực hành tốt. Sẽ tốt hơn nếu bạn nhìn vào bản vẽ CALayer. Bạn có thể sử dụng tùy chỉnh CGMutablePathRef để vẽ.

Vì vậy, UIView là tốt cho xử lý chạm nhưng không tốt để vẽ hình dạng.

+0

Tôi cũng muốn xử lý Cử chỉ trên 'UIView' cụ thể đó (như di chuyển và thay đổi kích thước). – Peres

+0

@JackyBoy Nó không phải là một vấn đề ở đây là một số bước sau: 1) tạo ra cái nhìn mới 'UIView * view' 2) tạo một layer mới ' CALayer * shapeLayer view.layer = shapeLayer' 3) Thêm cử chỉ '[ xem addGestureRecognizer: panGesture]; ' – Danil

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