2

「Aspect Fit」に設定されたビューは、画像の比率を維持しながらUIImage、 の現在の境界内に収まるように画像を自動的に動的にスケーリングします。UIUmageViewUIViewAspect Fit」に設定しても、サブビューには同じ効果がないようです。

以下のコードを使用して、コードを介して親ビューを設定しようとし、自動サイズ変更マスクでいくつかのバリエーションを試しました(自動レイアウトは使用していません)。親ビューの現在のサイズに基づいてサブビューの適切なスケールを計算するために、少しコードを書く必要がありますか?

[self.view setContentMode:UIViewContentModeScaleAspectFit];
4

4 に答える 4

6

ドキュメントから:

コンテンツモードは、ビューの境界が変更されたときに、ビューのレイヤーのキャッシュされたビットマップを調整する方法を指定します。

画像ビューの場合、これは画像について話します。そのコンテンツを描画するビューの場合、これは描画されたコンテンツについて話します。サブビューのレイアウトには影響しません。

サブビューに配置されている自動サイズ変更マスクを確認する必要があります。ここでは、コンテンツモードは真っ赤なニシンです。自動サイズ変更マスクを使用して必要なレイアウトを実現できない場合はlayoutSubviews、サブビューの位置とフレームを手動で実装および計算する必要があります。

于 2013-01-01T15:01:17.223 に答える
2
  • コンテンツ モードは、ビューのサブビューには影響しません。
  • サブビューのレイアウト方法を決定するには、自動サイズ変更マスクを使用します。
  • それが十分でない場合は、実装することをお勧めします layoutSubviews

参照元: https://stackoverflow.com/a/14111480/1374512

その他の有用な情報layoutSubviews: https://stackoverflow.com/a/5330162/1374512

于 2013-03-28T06:33:36.613 に答える
1

これはどう :

 self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

または、これを試すことができます:

// horizontal 
   childView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |  UIViewAutoresizingFlexibleRightMargin;

// vertical 
   childView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;

// both 
   childView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;

さらに参照が必要な場合は、次の 2 つの美しい質問があると思います。

1)プログラムによるマスクの自動サイズ変更

2) UIView と AutoresizingMask は無視されます

于 2013-01-01T13:44:14.753 に答える
0

私はそれで遊んでいます。これは不完全で、縦向きのサブビューのスケーリングを処理するだけですが、今のところ問題なく動作します。

if (self.view.bounds.size.width < self.view.bounds.size.height) {
    NSLog(@"view is portrait");
    if (_sview.frame.size.width < _sview.frame.size.height) {
        NSLog(@"subview is portrait");
        [UIView animateWithDuration:0.1
                         animations:^{
                             _sview.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0);
                         }];
    } else {
        NSLog(@"subview is landscape");
    }
} else {
    NSLog(@"landscape");
    if (_sview.frame.size.width < _sview.frame.size.height) {
        [UIView animateWithDuration:0.1
                         animations:^{
                             _sview.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.65, 0.65);
                         }];
    } else {
        NSLog(@"subview is landscape");
    }

}
于 2013-01-01T16:40:31.317 に答える