2016-11-10 111 views
0

我有块破iOS应用试验,以了解更多有关UI功能无法正常工作。目前,我有问题试图使其适用于屏幕旋转。的UIImageView autoresizingmask在某些情况下

我能够得到块屏幕旋转后正确地重新安排,但我有与获取的UIImageView的桨重新安排的麻烦。

我的代码被划分如下,VC调用初始化块模型类的对象。该对象存储CGRect属性(这是与桨的ImageView对应的CGRect)。

VC随后创建一个imageView,并使用paddle图像进行初始化,在图像视图上设置autoresinging属性(具有灵活的外部遮罩),根据模型对象中的CGRect设置框架并将imageView添加为子 - VC正在处理的主要观点的观点。

代码如下。

当我旋转,我看到了ImageView的没有被自动重新定位。

如果我做所有的图像查看和创建的CGRect在VC,那么它的工作原理(代码示例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

发现的问题。我使用模型对象来处理我所有的“游戏对象位置”逻辑。例如,VC将从触摸事件&中计算X轴增量,将它们转发给模型对象。此外,CADisplayLink事件将被转发,以便模型可以根据自上次事件以来的速度和时间更新球位置。然后它将使用更新的位置来检测碰撞。这种分裂被使用,因为模型类也必须检测与两侧桨/球的碰撞等方法

的问题是,该模型对象中加入从VC收到的增量改写paddleView的的CGRect它存储的当前paddleRect的origin.x。这个paddleRect没有考虑到通过旋转后自动调整大小来对CGRect进行的自动调整。

定盘为VC调用该模型中的方法来更新所有的游戏特性和检测碰撞之前设置paddleRect(设置为paddleView帧)的的CGRect。这种模式只考虑了共谋检测的逻辑,并基于它来更新球的运动和速度。 VC使用当前的paddleView位置,因此会自动考虑CGRect的自动调整,这是通过旋转后自动调整大小来完成的。

已更新github链接中的源代码。

相关问题