UIImageView autoresizingmask在某些情况下不起作用

时间:2016-11-10 22:11:04

标签: cocoa-touch uiimageview autolayout uikit autoresizingmask

我正在尝试使用破坏性的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];

1 个答案:

答案 0 :(得分:0)

发现了这个问题。我正在使用模型对象来处理我所有的游戏对象位置"逻辑。例如,VC将根据触摸事件计算X轴增量。将它们转发给模型对象。此外,CADisplayLink事件将被转发,以便模型可以根据自上次事件以来的速度和时间更新球位置。然后,它将使用更新的位置来检测冲突。使用这种分割是因为模型类还有检测与侧面,桨/球等碰撞的方法。

问题是模型对象通过将从VC接收的delta添加到它存储的当前paddleRect的origin.x来重写paddleView的CGRect。这个paddleRect没有考虑到旋转后自动调整大小来自动调整CGRect。

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

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