0

这是相当高的水平,但可可很大,我仍在努力解决它。有人可以验证我的期望吗...

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

我可以在 Interface Builder 中设置初始布局,但不确定如何将自定义对象连接回数组?有些需要以旋转状态开始。也无法弄清楚如何在 IB 中轮换?!?所以我猜在这种情况下,最好在视图显示之前在代码中构建初始状态。

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

4

1 回答 1

0

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

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

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

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

也就是说,不可能将一堆视图绑定到单个数组出口。在这种特殊情况下,我将实现视图控制器的“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);
}
于 2009-06-26T23:20:51.433 回答