4

UIImageView を含む UIView があります。UIImageViews は、アプリのブランド ロゴのように機能します。デバイスを回転させると、含まれている UIView のサイズが画面の横または縦の比率に対応するように変更されます。

私が達成しようとしているのは、それに応じて UIImageView をスケーリングし、プロポーションも左マージンに保つことです。

これは、一番上の白い「バナー」の実際のコードです。

UIView *topBanner = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, height_topBanner)];
[topBanner setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin)];
[topBanner setBackgroundColor:[UIColor whiteColor]];
topBanner.autoresizesSubviews = YES;

    // the logo
    UIImage *topBanner_logo = [UIImage imageNamed:@"logo.png"];
    float logoAspectRatio = topBanner_logo.size.width/topBanner_logo.size.height;
    topBanner_logoView = [[UIImageView alloc] initWithFrame:CGRectMake(topBanner.frame.size.width/100*3, topBanner.frame.size.height/100*7, (topBanner.frame.size.height/100*86)*logoAspectRatio, topBanner.frame.size.height/100*86)];
    [topBanner_logoView setImage:topBanner_logo];
    topBanner_logoView.backgroundColor = [UIColor blueColor];
    topBanner_logoView.contentMode = UIViewContentModeScaleAspectFit;
    [topBanner_logoView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin)];
    [topBanner addSubview:topBanner_logoView];

[self.view addSubview:topBanner];

これが私の出発点です。起動時に iPad を縦向きにします。

縦向きモードで起動

これを横向きに回転させると、次のようになります。 起動後のランドスケープモード

ご覧のとおり、UIImage の縦横比は問題ありませんが、UIImageView はコンテナーのサイズの変更に合わせて伸縮するため、余分な境界線が表示されます (UIImageView の背景色を強調表示するように設定します)。 UIImage は UIImageView に収まり、その中央に配置されます。

アプリを横向きモードで直接起動すると、同じ-逆-が発生します。 ランドスケープモードでの起動

それから私はそれを回転させます:

起動後のポートレートモード

...そして、上下に余分な境界線があるロゴを取得します。

回転の変更ごとにすべてのサイズを再計算する関数を作成できることはわかりますが、iOS の自動回転/サイズ変更手順をハッキングせずに UIImageView と UIImage を設定して機能させる方法があるかどうかを自問しています。 . とてもシンプルに聞こえます!

4

3 に答える 3

1

UIViewContentModeScaleAspectFitを使用せずに、代わりに画像の縦横比を計算し、それを使用して、もう一方 (幅または高さ) に基づいて幅または高さを明示的に指定することで、これを解決できます。

たとえば、横向きに回転するので、高さをビューの 80% にします。

    CGFloat w = logo.image.size.width;
    CGFloat h = logo.image.size.height;
    CGFloat a = w / h;

    CGFloat h_use = self.view.height *0.8;
    CGFloat w_use = h_use*a;

UIViewContentModeScaleAspectFillさらに、アスペクト比を明示的に設定したので、代わりにコンテンツ モードをに設定します。

于 2014-11-25T03:12:01.687 に答える
0

自動サイズ変更マスクを柔軟な高さと幅に設定しました:

[topBanner_logoView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleRightMargin)];

そうしないと、デフォルトでは、ビューのサイズが変化しないため、画像も変化しません。

于 2012-10-15T16:11:01.180 に答える
0

のせいだと思うtopBanner_logoView.contentMode = UIViewContentModeScaleAspectFit;

topBanner_logoView.contentMode = UIViewContentModeCenterまたは、 UIImageViewtopBanner_logoView.contentMode = UIViewContentModeLeftの画像のサイズ変更 (およびパディングの取得) を防止してください。

UIImageView のサイズが変更されている場合は、自動サイズ変更マスクを削除します。

于 2012-10-15T20:53:30.533 に答える