1

iOSアプリケーションを作成しています。ナビゲーションコントローラー内で機能します。私が最近作成したビューでは、UITextViewsUIImageViewが間違った座標で間違って表示されています。これはのせいかもしれませんUINavigationBar

Interface Builderでビューをミラーリングするように設定すると、実際にはビューが正しく表示されませんでした。これは。によるものだと思いUINavigationBarます。正しく表示されるまでInterfaceBuilderの座標を変更することで、これを「修正」することができました。これは、InterfaceBuilderが現在どのように見えるかです。

ビューを両方のデバイスの向き(縦向きと横向き)で機能させたい。ビュー内のオブジェクトは回転するように簡単に指示できないため、プログラムでビューを配置しています。コードは次のとおりです。

-(void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation {
    if (orientation == UIInterfaceOrientationPortrait) {
        appInfo.frame = CGRectMake(20, 19, 280, 90);
        updateInfo.frame = CGRectMake(20, 117, 280, 86);
        authorInfo.frame = CGRectMake(20, 229, 172, 200);
        authorImage.frame = CGRectMake(190, 274, 110, 110);
    }
    else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        appInfo.frame = CGRectMake(11, 44, 199, 124);
        updateInfo.frame = CGRectMake(218, 53, 242, 124);
        authorInfo.frame = CGRectMake(11, 180, 340, 90);
        authorImage.frame = CGRectMake(350, 170, 110, 110);
    }
}

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self adjustViewsForOrientation:toInterfaceOrientation];
}

-(void) viewWillAppear:(BOOL)animated {
    [self adjustViewsForOrientation:self.interfaceOrientation];

    [super viewWillAppear:animated];
}

これが私の主な問題です。 ビューを横向きに回転すると、オブジェクトが直接配置されなくなります。それらは、回転中に呼び出される座標に記述されているものには従いません。

この問題は、回転して縦向きに戻した場合にも発生します。

どうすればこれを解決できますか? 前もって感謝します。

4

3 に答える 3

3

さまざまなテキストボックスを新しい幅にして、配置するテキストに合わせるために必要なサイズを把握するために、複雑なことを行うことができますがsizeWithFont:constrainedToSize、UILabel / UITextViewとUIImageViewを削除する方が、おそらく簡単です。UIWebViewビュー全体を埋めるを作成し、それを使用しloadHTMLString:baseURLて、コピーとバンドル内の画像へのリンクを含むHTML文字列を提供するだけです。

アップデート:

問題は、(a)autoResizingMasksが明らかに設定されていることです。(b)新しいフレームの設定が早すぎます(したがって、方向転換が行われると、autoResizingMaskがフレームを再度調整します)。

だから、いくつかの考え:

まず、Interface Builderで自動サイズ変更マスクがオンになっている可能性があります。たとえば、次のようになります。

自動サイズ変更がオンになっているサイズインスペクター

したがって、自動サイズ変更マスクをオフにします。

自動サイズ変更がオフのサイズインスペクター

第二に、IBでそれを行うと確信していますが、参考までに、プログラムでオフにすることもできます。

appInfo.autoresizingMask = 0;
updateInfo.autoresizingMask = 0;
authorInfo.autoresizingMask = 0;
authorImage.autoresizingMask = 0;

第三に、自動サイズ変更がコントロールを台無しにする機会があった後、フレーム座標を変更したい場合があります。通常、この種のフレーム調整を延期する人がいます。これは、(a)新しい向きの座標があるためdidRotateFromInterfaceOrientationではなくwillRotateToInterfaceOrientation(ナビゲーションコントローラーは横向きと縦向きで高さが異なるため、重要な場合がありますが、そうではない場合があります)あなたの場合); 偶然にも(b)意図しない自動サイズ変更マスクによって導入された可能性のある調整を修正します。

viewWillLayoutSubviews個人的には、iOS 5以降、およびdidRotateFromInterfaceOrientation以前viewWillAppearのバージョンのiOSでフレームをリセットすることにしました(これらはすべてプログラムでコードで行います)。iOS 5の代替案はviewWillLayoutSubviews、回転アニメーションの直前にフレームを設定し、回転アニメーションでフレームの変更をアニメーション化するため、優れています。これは、非常に微妙な変更ですが、非常に滑らかです。これを正しく実行するアプリに気づき始めたら、常にそのようにしたいと思うでしょう。

于 2012-06-01T03:31:57.063 に答える
2

AdjustViewsForOrientation:の呼び出しは、willRotateToInterfaceOrientation:duration:コールバックからの呼び出しが早すぎます。代わりに、adjustViewsForOrientation:への呼び出しをwillAnimateRotationToInterfaceOrientation:duration:コールバックに移動します。ドキュメントから:

By the time this method is called, the interfaceOrientation property is already set to the new orientation, and the bounds of the view have been changed. Thus, you can perform any additional layout required by your views in this method.

UIViewController willAnimateRotationToInterfaceOrientation:duration:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
   [self adjustViewsForOrientation:toInterfaceOrientation];
}
于 2012-06-02T14:43:01.790 に答える
1

他のコメントで説明されているように、個々のコントロールを作成し、向きの変更時にそれらを移動すると、優れたレベルのコントロールが得られますが、より簡単なアプローチは、単一のUIWebViewコントロールを作成し、テキストの再フォーマットを利用できるようにすることです。より広い画面用。また、UIWebViewを使用すると、テキストの書式設定(太字、斜体)やハイパーリンクの追加(特に電子メールアドレスと電話番号の場合)が簡単になります。とにかく、UIWebViewのHTML文字列を作成する例を次に示します。

- (NSString *)htmlString
{
    NSURL *imgUrl = [[NSBundle mainBundle] URLForResource:@"IMG_0999" withExtension:@"PNG"];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    NSString *htmlBodyTemplate = 
        @"<html>"
        @"<style type=\"text/css\">"
        @"html {"
        @"    -webkit-text-size-adjust: none; /* Never autoresize text */"
        @"}"
        @"</style>"
        @"<body style=\"font-family:Verdana, Geneva, sans-serif; font-size:14px;\">"

        @"<p>This application is version %@. The recommended iOS version for running this application is iOS 5.0+. The minimum iOS version is iOS 4.3.</p>"
        @"<p>This application will automatically check for updates at startup. It is recommended to immediately update the app when prompted.</p>"
        @"<img src=\"%@\" style=\"float:right;\" width=\"150px\" />"
        @"<p>This application was created by Ridgefield High School student <strong>Devin Gund</strong> in 2012. He worked with the Ridgefield Public Schools technology department in publishing this application.</p>"

        @"</body>"
        @"</html>";

    return [NSString stringWithFormat:htmlBodyTemplate, version, [imgUrl relativeString]];
}

次に、viewDidLoadに次の行を含めます。

[self.webView loadHTMLString:[self htmlString] baseURL:nil];
于 2012-06-03T14:43:17.677 に答える