概念化Cocoa Touch Views,Controllers& OO编程一般

时间:2009-06-26 23:03:08

标签: cocoa-touch uiview

这是相当高的水平,但可可很大,我仍然试图解决它。有人可以证实我的期望......

假设我想在屏幕上显示可变数量的视图(例如汽车的图像),用户可以触摸和移动。您是否可以使用UIImage属性(而不是UIImageView或UIButton)继承UIView。然后在视图控制器中实例化说“红色”,“蓝色”和“黄色”汽车并将它们存储在NSMutableArray中?

我可以在Interface Builder中设置初始布局,但不确定如何将自定义对象连接回阵列?有些人需要以旋转状态开始。还没弄明白如何在IB中旋转?!?所以我猜测在这种情况下,最好在视图显示之前在代码中构建初始状态。

最后,一旦显示,处理touchesBegan,Ended等,动画以及在视图控制器中添加,删除和计算“汽车”的逻辑?

1 个答案:

答案 0 :(得分:0)

听起来你走在正确的轨道上。我将尝试一次解决您的所有期望:

  1. 屏幕上的视图可以是自定义UIView子类或UIImageViews。您可能想要考虑将来要添加的其他功能。 UIView方法提供了最大的灵活性,并且还允许您通过手动绘制汽车图像来处理旋转。为此,创建一个UIView的子类,给它一个图像属性和一个旋转属性,然后覆盖“drawRect:(CGRect)rect”函数来绘制图像。

  2. 在视图控制器中放置一系列汽车听起来很棒。

  3. 在Interface Builder NIB文件中存储初始布局通常是最好的选择。它允许您在将来轻松更改界面,并删除在屏幕上创建和定位内容所需的大量样板代码。

  4. 也就是说,将一堆视图绑定到单个阵列插座是不可能的。在这种特殊情况下,我将实现视图控制器的“viewDidLoad”函数来创建多个汽车。你走在正确的轨道上了!

    在Interface Builder中设置旋转是不可能的,因为它不是一个流行的选项。您可以使用CAAnimation变换实现旋转以设置旋转属性,然后以一定角度手动绘制图像。

    希望有所帮助!

    编辑:这是一些以一定角度绘制图像的示例代码。它使用Quartz(也称为Core Graphics) - 因此Apple文档中提供了更多信息

    - (void)drawRect:(CGRect)r
    {
        // get the drawing context that is currently bound
        CGContextRef c = UIGraphicsGetCurrentContext();
    
        // save it's "graphics state" so that our rotation of the coordinate space is undoable.
        CGContextSaveGState(c);
    
        // rotate the coordinate space by 90º (in radians). In Quartz, images are 
        // always drawn "up," but using CTM transforms, you can change what "up" is!
        // Can also use TranslateCTM and ScaleCTM to manipulate other properties of coordinate space.
        CGContextRotateCTM(c, M_PI / 2);
    
        // draw an image to fill our entire view. Note that if you want the image to be semi-transparent,
        // the view must have opaque = NO and backgroundColor = [UIColor clearColor]!
        CGContextDrawImage(c, self.bounds, [[UIImage imageNamed:@"image_file.png"] CGImage]);
    
        // restore the graphics state. We could just rotate by -M_PI/2, but for complex transformations
        // this is very handy.
        CGContextRestoreGState(c);
    }