2011-12-14 62 views
4

所以我有一個UIImageView,它可以通過touchesMoved圍繞它的中心旋轉。從概念上講,應該如何在OOP中構造?

目前所有的代碼都在我的ViewController中,檢測觸摸,計算和跟蹤當前旋轉,圖像本身以及圖像的實際旋轉。

但現在我想整理一下,並做好。我創建的這個「spinner」應該是一個獨特的對象,可以多次實例化,並且可以放在任何需要的地方。

所以我創造我的新的微調類和其追蹤其自身的形象和角度屬性...

但是這應該是一個NSObject用的UIImageView的財產,或者是一個實際的UIImageView本身? 觸摸應該如何處理,ViewController是否需要扮演一個角色,或者該對象是否可以跟蹤自己的觸摸?

-

編輯:還是希望有一個明確的答案,我的這個老問題。

UIControl子類我認爲當我的微調器只是一個抽象的圖像,它可以旋轉和響應觸摸時,它是有意義的。

但是,當它與位置,速度更復雜時,需要與其他對象交互,在多次啓動時保持(NSManagedObject子類?)等。觸摸和圖像只成爲整體的一小部分。這就是爲什麼我認爲UIImage只是對象的另一個屬性。

作爲一個簡單的例子,想想一堆彈在盒子裏跳動的球。他們需要從側面反彈,彼此反彈,旋轉,對重力作出反應,在接觸時作出反應 - 並在發射之間堅持。

所以從概念上來說,這應該如何在OOP中構造?

+2

這聽起來像UIControl是最合適的父類,但你需要解釋更多關於你想如何使用它(由程序員和最終用戶)以及圖像來自哪裏如果你想要合理的建議。 – 2011-12-14 23:44:15

+0

微調框是我的'模型'的一部分,雖然不是嗎? MVC是不是意味着我的模型不應該是UIView子類? – trapper 2011-12-16 17:17:46

回答

0

你問的「有道」,彷彿在OOP只有一個正確的答案。

實際上沒有一個正確的設計。這與您期望代碼將來如何擴展和重用有關。

如果你真的想爲每一個可以想象的擴展做好準備,那麼你最終會得到一個荒謬複雜的設計,但還沒有完全覆蓋。

在你的例子中:從觸摸控制的微調器轉到2D物理模擬的一部分...這是一個很長的跳躍。爲什麼我甚至想用一個通用的基類實現它?

  • 如果你只是想在屏幕上可以旋轉的東西的基類......我會說這太泛化了。沒有足夠的附加值來證明新的類:UIView已經可以做到這一點。

  • 如果您的原始對象是爲了獲得用戶輸入,然後堅持iOS和UIControl的子類的設計模式。

  • 如果你設想一個物理模擬。那麼你可能有一個整體的階級結構,是獨立的它是如何顯示在屏幕上:

剛性類來描述每個對象的機械性能(形狀,重量,...)(可能是一個分類。您可以使用單獨的代表進行碰撞檢測。) RigidState,描述剛體的位置和速度。 一個RigidSimulator,擁有一組剛體和每個剛體的RigidState。 RigidViewController可以爲給定的Rigid創建一個UIView(可能是一個UIImageView),並可以調整它的大小和位置(給定一個RigidState)。 ... 沿着這些線的東西。

3

您應該使用UIControl作爲父類,並將UIImageView屬性添加爲子視圖。 UIControl具有可以覆蓋以跟蹤觸摸的方法。

+0

我也會用這種方式去。您可以通過一個班級設置簡單使用的事件和配置。 – DBD 2011-12-15 01:36:20

0

我有一個與此非常相似的對象。我稱它爲MBlob,適用於MediaBlob。它知道如何做各種各樣的事情,比如如何分割它自己2,與另一個MBlob(根據形狀適當調整大小)等,它也知道如何產生自己的WebView(加載一個URL),得到調整大小(例如旋轉,手勢)等。非常方便的類製作小應用程序,我假設許多開發人員有類似的東西。在我的應用商店應用程序,QCount(免費)和QPlus中使用類似的類。

構造對象的一種方法是作爲NSObject的子對象,然後掛鉤某些協議以便爲要使用的內置項目創建對象。例如,我的界面如下所示:

@interface MBlob : NSObject <UIWebViewDelegate, UIPopoverControllerDelegate> { 
    id _delegate; 
} 

所有屬性在.m文件中都以@synthesize varName = _varName的形式實現。

然後你可以掛鉤這個項目的各種意見。這可能有點過分,但我的MBlob甚至知道如何啓動首選項編輯器來編輯它自己的首選項,而不會影響擁有的VC。下面是一些耐人尋味:

@property (nonatomic, strong) UIView* preview; 
@property (nonatomic, strong) UIView* displayView; 
@property (nonatomic, strong) UIWebView* webView; 
@property (nonatomic, strong) UIToolbar* toolbar; 
@property (nonatomic, strong) UIActivityIndicatorView* activityIndicator; 
@property (nonatomic, strong) NSTimer* timer; 
@property (nonatomic, strong) NSString* mediaType; 
@property (nonatomic, strong) NSString* mediaValue; 
@property (nonatomic) CGFloat aspectRatio; // width:height 
@property (nonatomic) BOOL  aspectRatioLocked; 
@property (nonatomic) CGSize nativeSize; 
@property (nonatomic) CGPoint nativeLocation; 
@property (nonatomic, strong) NSString* title; 
@property (nonatomic, strong) UITextField* titleTextField; 
@property (nonatomic, strong) UIFont* font; 
@property (nonatomic) BOOL fullScreen; 
@property (nonatomic, strong) WebviewButtonPreferences* webviewButtonPreferences; 
@property (nonatomic, strong) PreferencesEditorViewController* preferencesEditorVC; 

我一個警告是,蘋果已經取得了很多的東西通過內置類容易,所以不要過分。例如在我上面的代碼中,我真的需要一個字體嗎?我不知道,這不是我的活動代碼,但它是你描述的那種對象的一個​​例子。如果您要添加更多功能,請使用NSObject的傘類子類,並讓其他類想要使用屬性。

祝你好運,

達明