所以我有一个UIImageView,可以用touchesMoved旋转它的中心。
目前所有代码都在我的ViewController中,检测触摸,计算和跟踪当前旋转,图像本身和图像的实际旋转。
但是现在我想整理一下并正确地做到这一点。我创建的这个'spinner'应该是一个独特的对象,可以多次实例化并放在我需要的任何地方。
所以我创建了我的新Spinner类,它跟踪自己的图像和角度属性......
但是这应该是一个带有UIImageView属性的NSObject,还是一个真正的UIImageView本身? 如何处理触摸,ViewController是否需要播放部分或者对象能够以某种方式跟踪其自己的触摸?
-
编辑:仍然希望能够清楚地回答我这个古老的问题。
UIControl子类我认为当我的微调器只是一个旋转并响应触摸的抽象图像时,它是有意义的。
但是当位置,速度更复杂,需要与其他对象交互时,会持续多次启动(NSManagedObject子类?)等等。触摸和图像只占整体的一小部分。这就是为什么我认为UIImage只是对象的另一个属性。
作为一个简单的例子,想到一堆球在一个盒子里蹦蹦跳跳。它们需要从侧面反弹,相互反弹,旋转,响应重力,触摸时响应 - 并且在发射之间持续存在。
从概念上讲,如何在OOP中构建它?
答案 0 :(得分:3)
您应该使用UIControl作为父类,并将UIImageView属性添加为子视图。 UIControl具有可以覆盖以跟踪触摸的方法。
答案 1 :(得分:0)
我有一个与此非常相似的对象。对于MediaBlob,我将其称为MBlob。它知道如何做各种各样的事情,比如如何分割它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;
我唯一的注意事项是Apple通过内置类使很多事情变得简单,所以不要过度。例如,在上面的代码中,我真的需要一个字体吗?我不知道,这不再是我的活动代码了,但它是你所描述的那种对象的一个例子。如果您要添加更多功能,请使用NSObject的伞状子类,并创建您想要使用属性的任何其他类。
祝你好运,达明
答案 2 :(得分:0)
你要求'正确的方式',好像在OOP中有一个正确的答案。
实际上没有一个正确的设计。这与您期望代码在未来扩展和重新利用的方式有关。
如果你真的想为每一个可以想象的扩展做好准备,那么你最终会得到一个非常复杂的设计,但仍然没有涵盖所有这些。
在你的例子中:从触控式旋转器转到2D物理模拟的一部分......这是一个相当长的跳跃。为什么我甚至想用一个共同的基类实现它?
如果你只是想在屏幕上显示“可以旋转的东西”的基类......我会说这太过于通用了。没有足够的附加价值来证明新类的合理性:UIView已经可以做到了。
如果您的原始对象是为了获取用户输入,那么请坚持使用iOS和子类UIControl的设计模式。
如果您想要进行物理模拟。那么你可能有一个完整的类结构,它独立于它在屏幕上的显示方式:
描述每个对象(可能是类树)的机械属性(形状,重量等)的刚性类。您可以使用单独的代理进行碰撞检测。) 一个RigidState,描述刚性的位置和速度。 一个RigidSimulator,拥有一组Rigids和一个刚性的RigidState。 一个RigidViewController,它可以为给定的Rigid创建一个UIView(可能是一个UIImageView),并可以调整它的大小和位置(给定一个RigidState)。 ... 沿着那条线的东西。