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