2016-11-10 12 views
0

UI機能の詳細については、ブロックブロッキングのiOSアプリケーションを試しています。現在、私は画面回転のためにそれを働かせようとする問題を持っています。UIImageViewの自動サイズ変更マスクが動作しない場合がある

ブロックを画面の回転後に正しく配置することができましたが、パドルの配置を変更するためのUIImageViewの取得に問題があります。

私のコードは次のように分割されています.VC呼び出しはBlockModelクラスのオブジェクトを初期化します。このオブジェクトはCGRectプロパティ(パドルのImageViewに対応するCGRect)を格納します。

VCは、パドル画像で初期化されたimageViewを作成し、画像ビューに自在プロパティを設定し(柔軟な外部マスクを使用)、modelオブジェクトのCGRectに基づいてフレームを設定し、imageViewをサブとして追加しますVCが処理しているメインビューのビュー。

コードは次のとおりです。

回転すると、ImageViewが自動的に再配置されていないことがわかります。

vCですべてのイメージビューとCGRect作成を行うと、それは動作します(コードサンプル2)。

これが期待どおりの動作ですか?はいの場合、CGRectが別のオブジェクトのプロパティから取得されていると、自動サイズ変更が実行されないのはなぜですか?

完全Xcodeのプロジェクトコードはhere(githubのリンク) は、私はプロパティとしてImageViewのを保存する場合は動作しないもののように見える

EDITです。私はそれにすばやくアクセスできるようにこれをやっていました。 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; 
} 

ImageViewのが初期化されているVCでのコード

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]; 

私の代わりに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でこのコードを使用している場合は、問題を発見しました。私はすべての私の "ゲームオブジェクトの場所"ロジックを処理するためにモデルオブジェクトを使用していました。たとえば、VCは、タッチイベント&からX軸デルタをモデルオブジェクトに転送します。また、CADisplayLinkのイベントは、モデルが最後のイベント以降の速度と時間に基づいてボールの位置を更新できるように転送されます。更新された場所を使用して衝突を検出します。モデルクラスには、サイド、パドル/ボールなどとの衝突を検出するメソッドがあるため、この分割が使用されました。

モデルオブジェクトは、VCから受け取ったデルタをpaddleViewのCGRectに追加しました。現在のpaddleRectのorigin.xを格納していました。このpaddleRectでは、回転後の自動サイズ変更によって行われるCGRectへの自動調整は考慮されていません。

修正点は、モデル内のメソッドを呼び出す前にVCがpaddleRectのCGRect(paddleViewフレームに設定)を設定して、すべてのゲームプロパティを更新して衝突を検出することでした。このようにして、モデルは結託検出の論理を処理し、それに基づいてボールの移動と速度を更新します。 VCは現在のパドルビュー位置を使用するため、回転後の自動サイズ変更によって行われるCGRectへの自動調整を自動的に考慮します。

githubリンクのソースコードが更新されました。

関連する問題