3

アプリがサーバーに接続しているときに表示される小さなメッセージがあります。アプリの起動時、およびアプリがこのメッセージを表示する必要がある残りの時間はうまく機能しますが、アプリをスリープ状態にしてからバックグラウンドに置いてからスリープ解除すると、メッセージが再び表示されますが、フレーム全体が上に移動します。スクリーンショットを参照してください。最初のメッセージは起動直後で、下部にそのメッセージが表示されて正しく消え、ビューは以前の状態に戻り、完璧になります。

ここに画像の説明を入力してください

ただし、2番目のスクリーンショットは、アプリをバックグラウンドに移動してからウェイクアップした結果です。 " applicationDidBecomeActive"サーバーへの接続が必要なメソッドがあるため、小さなビューが表示される必要があります。問題は、ウィンドウまたはnavigation controller移動がステータスバーの後ろに移動することです。そしてその空白を残します

ローンチからのアプリ

ナビゲーションビューを短くし、そのメッセージビューを追加して、もう一度長くするために使用するコードを次に示します。

- (void)addMessageView:(NSString *)message{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
if(![window viewWithTag:3]){//Si no hay un messageView no lo meto.
    [window addSubview:messageView];
    CGRect frameWindow = window.frame;
    int heightMessage = 50;
    messageView.frame = CGRectMake(0, frameWindow.size.height, 320, heightMessage);



    UINavigationController *nav = window.rootViewController;


    //Pillo el UILabel y lo seteo
    UILabel *label = (UILabel *)[messageView viewWithTag:1];
    label.text = message;
    CGSize maximumLabelSize = CGSizeMake(296,9999);
    CGSize sizeMsg = [label.text sizeWithFont:label.font constrainedToSize:maximumLabelSize lineBreakMode:label.lineBreakMode];
    UIActivityIndicatorView *activity = (UIActivityIndicatorView *)[messageView viewWithTag:2];
    int xLabel = (320 - (sizeMsg.width + activity.frame.size.width + 5))/2;

    CGRect frameActivity = activity.frame;
    activity.frame = CGRectMake(xLabel, 13, frameActivity.size.width, frameActivity.size.height);
    label.frame = CGRectMake(xLabel + activity.frame.size.width + 5, 15, sizeMsg.width, sizeMsg.height);


    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];


    nav.view.frame = CGRectMake(frameWindow.origin.x, frameWindow.origin.y, frameWindow.size.width, frameWindow.size.height - heightMessage);
    messageView.frame = CGRectMake(0, frameWindow.size.height - heightMessage, 320, heightMessage);

    [UIView commitAnimations];

}
}

また、前の位置に戻すには:-(void)hideMessageView {

UIWindow *window = [UIApplication sharedApplication].keyWindow;
UINavigationController *nav = window.rootViewController;
CGRect frameWindow = window.frame;
if([window viewWithTag:3]){//Si no hay un messageView no lo meto.
    [UIView animateWithDuration:0.3
                     animations:^{
                         nav.view.frame = CGRectMake(frameWindow.origin.x, frameWindow.origin.y, frameWindow.size.width, frameWindow.size.height);
                         messageView.frame = CGRectMake(0, frameWindow.size.height +5 , 320, 0);
                     }
                     completion:^(BOOL finished){
                         [messageView removeFromSuperview];

                     }];
}
NSLog(@"Tam Window: %@ y nav %@", frameWindow, nav.view.frame);
}

どう思いますか?

4

1 に答える 1

0

Autolayoutを無効にしてみてください。UI で同じ問題が発生しました。

于 2013-02-08T15:36:27.173 に答える