2012-03-29 63 views
5

Tôi đang làm việc trên một ứng dụng và tôi phải vẽ một đường trơn tru vì vậy tôi đã theo liên kết này để làm mịn dòng iPhone smooth sketch drawing algorithm và tôi đã theo dõi câu trả lời của kyoji. Nhưng bây giờ tôi không biết cách thực hiện chức năng Hoàn tác làm lại.Làm thế nào để Hoàn tác & Làm lại một đường trơn tru trong iPhone?

Vui lòng giúp

+0

bạn đã thử sử dụng lớp được xây dựng trong NSUndoManager – MCKapur

+0

tính năng này có sẵn trong Mac OS X v10.0 trở lên không có trong iOS. và ứng dụng của tôi nằm trong iOS – Mashhadi

+2

và iOS 3.0 trở lên: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUndoManager_Class/Reference/Reference.html –

Trả lời

0

Sử dụng NSUndoManager. Tuy nhiên, nếu bạn đang vẽ các đường trên khung vẽ, bạn cũng sẽ cần phải giữ nguyên hình đại diện của chúng (để bạn có thể bật chúng ra).

Vì vậy, cho dù bạn thu thập chúng dưới dạng UIBezierPath hay sử dụng các lớp hình dạng hay "mảng điểm" của riêng bạn, bạn hoàn tác theo cách tương tự.

Vì vậy, trong khi vẽ đường, giữ một bản ghi các điểm bạn đã sử dụng trong bản vẽ của mình. Khi bản vẽ được thực hiện (ví dụ: chạm vàoEnded), bạn muốn "đẩy" bản vẽ của mình và cho người quản lý hoàn tác biết cách hoàn tác bản vẽ đó. Đơn giản, nó sẽ là một cái gì đó như thế này gần như mã ...

- (void)pushDrawing:(Drawing*)drawing 
{ 
    [self.stack push:drawing]; 
    [self.undoManager registerUndoWithTarget: self 
            selector: @selector(popDrawing) 
             object: nil]; 
} 

- (void)popDrawing:(Drawing*)drawing 
{ 
    Drawing *drawing = [self.stack pop]; 
    [self.undoManager registerUndoWithTarget: self 
            selector: @selector(pushDrawing:) 
             object: drawing]; 
} 

Nếu bạn đang sử dụng một canvas, bạn có thể phải vẽ lại toàn bộ điều, đặc biệt là khi popping một bản vẽ. Nếu bạn đang sử dụng chế độ xem hoặc lớp, bạn có thể không ...

Xem tài liệu dành cho NSUndoManager ... tài liệu này có sẵn trên iOS và có các ví dụ hay. Nó "nhớ" nếu bạn undo-ing hoặc redo-ing, và sẽ làm điều đúng, do đó, ở trên có thể được thực hiện như một chức năng (nhưng nó dễ dàng hơn để hiểu lúc đầu với một chức năng đi mỗi hướng).

+0

Xin chào @JodyHagins, tôi cũng đang đối mặt với vấn đề hoàn tác và làm lại, tôi đang vẽ cho CGLayers, để tối ưu hóa. Tôi đã thử một số mã, nhưng không biết, nơi tôi goin sai, bạn có thể xin vui lòng xem mã, dưới đây là liên kết http://stackoverflow.com/questions/11394839/undo-redo-issues-with-cglayer. Đang chờ trả lời của bạn, cảm ơn – Ranjit

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