2010-05-10 19 views
6

Tôi đang cố gắng tạo một công cụ iPad nhỏ để vẽ các đối tượng hình học đơn giản (rect, rect rect, ellipse, star, ...). Mục tiêu của tôi là tạo một cái gì đó rất gần với Keynote (tính năng vẽ), tức là cho phép người dùng thêm trực tiếp (ví dụ), thay đổi kích thước và di chuyển nó. Tôi cũng muốn người dùng có thể chọn nhiều đối tượng và di chuyển chúng lại với nhau.Cách tốt nhất để thực hiện các tính năng vẽ như Keynote

Tôi đã nghĩ về ít nhất 3 differents cách để làm điều đó:

  • Mở rộng UIView đối với từng loại đối tượng, một lớp cho hình chữ nhật, một cho Ellipse, ... Với phương pháp vẽ tùy chỉnh. Sau đó, thêm khung nhìn này làm chế độ xem con của chế độ xem chung.
  • Mở rộng CALayer cho từng loại đối tượng, một lớp cho Rect, một lớp cho Ellipse, ... Với phương thức vẽ tùy chỉnh. Sau đó, thêm lớp này làm lớp con của lớp chế độ xem toàn cục.
  • Mở rộng NSObject cho từng loại đối tượng, một lớp cho Rect, một cho Ellipse, ... Chỉ với một phương thức vẽ mà sẽ nhận được như đối số một CGContext và một Rect và vẽ trực tiếp biểu mẫu trong đó. Những phương thức này sẽ được gọi bằng phương thức vẽ của chế độ xem toàn cục.

Tôi biết rằng hai cách đầu tiên có chức năng phát hiện cảm ứng trên từng đối tượng, để thêm bóng dễ dàng, ... nhưng tôi sợ rằng chúng hơi quá nặng? Đó là lý do tại sao tôi nghĩ về cách cuối cùng, mà nó có vẻ là thẳng về phía trước.

Cách nào sẽ hiệu quả hơn ??? Hay có lẽ tôi không nghĩ theo cách khác?

Bất kỳ trợ giúp nào sẽ được đánh giá cao ;-)

Cảm ơn.

Trả lời

1

Tôi muốn sử dụng các lớp UIKit để thực hiện bản vẽ của bạn, sau đó là hồ sơ và tối ưu hóa mã của bạn từ đó.

thông tin

Apple/iPad: link text

0

cảm giác đầu tiên của tôi là làm cách thứ 3, nhưng để được thuyết phục, chỉ sau khi tôi đã đăng bài viết của tôi, tôi đã làm một số xét nghiệm chỉ với một cái nhìn toàn cầu và hơn 200 dạng hình học (Rect, Rounded Rect và Ellipse) trên đó và tôi chỉ di chuyển một nửa với sự kiện touchMoved. Tôi đã làm thử nghiệm này với cách 1 (Subclassing UIView) và cách 3 (Subclassing NSObject), cách 2 dường như với tôi quá hạn chế và không giúp tôi cả. Việc resuslt là cách 1 có vẻ là hiệu quả hơn ... Không có lag khi tôi di chuyển 60 đối tượng với nhau! Hơn nữa bằng cách sử dụng theo cách này có lẽ sẽ giúp tôi bởi vì sử dụng xem đến mà một số chức năng thú vị như phát hiện cảm ứng trên con đường phức tạp (xem UIBezierPath), hệ thống phân cấp đối tượng được xử lý bởi ... Xem chi tiết

Vì vậy, tôi sẽ sử dụng theo cách đó và quay lại ở đây để chia sẻ kết quả của tôi ;-)

Kính trọng

0

Tốt hơn nên sử dụng các đối tượng CGLayer. Các lợi ích là:

  1. Hiệu quả bộ nhớ nhanh hơn và hiệu quả hơn nhiều. Đối với các đối tượng đơn giản, việc thêm chế độ xem sẽ đắt hơn và làm phức tạp hệ thống phân cấp khung nhìn. Đối với các đối tượng phức tạp, bộ nhớ đệm được thực hiện trên CGLayers có thể tăng hiệu năng.

  2. Thật dễ dàng để nhóm các đối tượng lại với nhau. bạn chỉ cần đặt mọi thứ vào một lớp mới, và thì đấy! Hầu như không có phí.

  3. Sử dụng CGLayer và các đối tượng Quartz khác giúp bạn linh hoạt hơn nhiều.

Hạn chế duy nhất là bạn phải trực tiếp sử dụng Quartz 2D. Nó không thực sự khó khăn, nhưng cần một số học tập nếu bạn đã không sử dụng nó trước đây.

0

CAShapeLayer khá nhiều xử lý tùy chọn của bạn 2. Nó làm rect và tròn rect (xem angleRadius) theo mặc định, hoặc bạn có thể cung cấp cho nó một con đường cho bất kỳ hình dạng tùy ý. Đối với lựa chọn của bạn 1, bạn có thể sử dụng một CAShapeLayer với một UIView thay vì thực hiện drawRect và nó có thể nhanh hơn.

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