我正在尝试使用破坏性的iOS应用来了解有关UI功能的更多信息。目前,我在尝试使其适用于屏幕旋转时遇到问题。
我能够在屏幕旋转后正确地重新安排块,但是在重新安排桨的UIImageView时遇到了麻烦。
我的代码分割如下,VC调用初始化BlockModel类的对象。该对象存储CGRect属性(对应于paddle&#39的ImageView的CGRect)。
然后VC创建一个用paddle图像初始化的imageView,在图像视图上设置autoresinging属性(具有灵活的外部蒙版),根据模型对象中的CGRect设置框架,并将imageView添加为子图像由VC处理的主视图的视图。
代码如下。
当我旋转时,我发现ImageView没有自动重新定位。
如果我在vC中完成所有图像视图和CGRect创建,那么它可以工作(代码示例2)。
这是预期的行为吗?如果是,如果从另一个对象的属性获取CGRect,为什么自动调整不踢?
完整的Xcode项目代码是here(github链接)
修改 如果我将imageView存储为属性,看起来不起作用。我这样做是为了快速访问它。如果将imageView存储为属性,为什么它不起作用?
初始化模型的代码
self.myModel = [[BlockerModel alloc] initWithScreenWidth:self.view.bounds.size.width andHeight:self.view.bounds.size.height];
模型初始化代码
-(instancetype) initWithScreenWidth:(CGFloat)width andHeight:(CGFloat)height
{
self = [super init];
if (self)
{
self.screenWidth = width;
self.screenHeight = height;
UIImage* paddleImage = [UIImage imageNamed:@"paddle.png"];
CGSize paddleSize = [paddleImage size];
self.paddleRect = CGRectMake((self.screenWidth-paddleSize.width)/2, (1 - PADDLE_BOTTOM_OFFSET)*self.screenHeight, paddleSize.width, paddleSize.height);
}
return self;
}
VC中初始化imageView的代码
self.paddleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"paddle"]];
self.paddleView.backgroundColor = [UIColor clearColor];
self.paddleView.opaque = NO;
self.paddleView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin;
NSLog(@"Paddle rect is %@",NSStringFromCGRect(self.myModel.paddleRect));
[self.paddleView setFrame:self.myModel.paddleRect];
[self.view addSubview:self.paddleView];
如果我在VC中使用此代码来初始化imageView的工作
UIImage* paddleImage = [UIImage imageNamed:@"paddle.png"];
CGSize paddleSize = [paddleImage size];
CGRect paddleRect = CGRectMake((self.view.bounds.size.width-paddleSize.width)/2, (1 - PADDLE_BOTTOM_OFFSET)*self.view.bounds.size.height, paddleSize.width, paddleSize.height);
UIImageView *paddleView = [[UIImageView alloc] initWithImage:paddleImage];
paddleView.backgroundColor = [UIColor clearColor];
paddleView.opaque = NO;
paddleView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin;
[paddleView setFrame:paddleRect];
[self.view addSubview:paddleView];
答案 0 :(得分:0)
发现了这个问题。我正在使用模型对象来处理我所有的游戏对象位置"逻辑。例如,VC将根据触摸事件计算X轴增量。将它们转发给模型对象。此外,CADisplayLink事件将被转发,以便模型可以根据自上次事件以来的速度和时间更新球位置。然后,它将使用更新的位置来检测冲突。使用这种分割是因为模型类还有检测与侧面,桨/球等碰撞的方法。
问题是模型对象通过将从VC接收的delta添加到它存储的当前paddleRect的origin.x来重写paddleView的CGRect。这个paddleRect没有考虑到旋转后自动调整大小来自动调整CGRect。
修复是为了让VC在调用模型中的方法之前设置paddleRect的CGRect(设置为paddleView帧),以更新所有游戏属性并检测冲突。这种方式模型只关注共谋检测的逻辑,并基于它来更新球的运动和速度。 VC使用当前的paddleView位置,因此自动考虑自动调整CGRect,这是通过在旋转后自动调整大小来完成的。
github链接中的源代码已更新。