web-dev-qa-db-ja.com

self.view.bounds.size.widthが間違った値を返す

私は今、非常に奇妙な問題に直面しています。取得 [[self view] bounds].size.width常に320デバイスに応じて変化しません。 iPhone 5、6、6 Plusがすべてを返します320.000000以下のすべてのメソッド。

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(@"%f", [[self view] bounds].size.width);
}
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSLog(@"%f", [[self view] bounds].size.width);
}
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%f", [[self view] bounds].size.width);
}

出力

2015-02-11 14:48:03.274 MyApp[2948:86285] 320.000000 
2015-02-11 14:48:03.274 MyApp[2948:86285] 320.000000
2015-02-11 14:48:03.783 MyApp[2948:86285] 320.000000

スプラッシュ画面もある。

ビューの実際のサイズを取得するにはどうすればよいですか?

15
Tapas Pal

使用する

NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);

の代わりに

NSLog(@"%f", [[self view] bounds].size.width);

それはあなたが期待したw/hを与えます。

14

-(void) viewWillAppear:(BOOL)animatedで_[[self view] bounds].size.width_ valueを読み取ろうとすると、正しい値が表示されることがわかります。

- (void)viewDidLoad _[[self view] bounds].size.width_では、.xibファイルにある正確なデザインが表示されます。

以下のサンプルとNSLogの結果を参照してください。

_- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSLog(@"%f",[[self view] bounds].size.width);

}
-(void) viewWillAppear:(BOOL)animated{
    NSLog(@"%f",[[self view] bounds].size.width);
    [testIndicator startAnimatingInView:self.view];
}
_

それぞれの結果は次のとおりです。

_2016-02-17 19:00:47.519 xxxxx[16107:504629] 320.000000
2016-02-17 19:00:47.521 xxxxx[16107:504629] 414.000000
_
9
icould

mainスレッドでそのようなことをするだけでよい場合もあります。

私のために、

DispatchQueue.main.async {
    //access to the frame/bounds
}

次に、フレーム/バインドに直接アクセスして動作します。

4
Hemang

代わりに- (void)viewWillLayoutSubviewsを使用してください。これを見てください: Managing View Layout

3
len

これは、iPhone 6および6 Plusのlaunchファイルがないために発生しています。次の2つの方法のいずれかを試してください。

  1. Xcodeで、ターゲットの一般に移動し、そこに起動画面(「メイン」)ファイルを追加します。
  2. アセットカタログを使用している場合は、LaunchImagesアセットカタログに移動し、2つの新しいiPhoneの新しい起動イメージを追加します。新しい画像を追加する場所を表示するには、右クリックして[Add New Launch Image]を選択する必要がある場合があります。

IPhone 6(Retina HD 4.7)には、750 x 1334の縦向きの起動画像が必要です。 iPhone 6 Plus(Retina HD 5.5)では、それぞれ1242 x 22082208 x 1242のサイズの縦向きと横向きの画像が必要です。

3
Bhavin

IPhone 6およびiPhone 6 Plusに適切なサイズの起動画像を追加することは絶対に必要です。そうでない場合、これらのデバイスは全画面に320ポイントの幅を拡大します。したがって、320が幅として報告されます。起動画像を使用すると、475または414が幅として報告されます。

2
konran
Use **viewDidLayoutSubviews** method

override func viewDidLayoutSubviews() {
    print("Size of View: \(view.bounds)")
}
2
Himanshu Ahuja

関連するタスクをviewWillLayoutSubviews()メソッドに表示します

 override func viewWillLayoutSubviews() {
    print("view Size: \(view.bounds.width)")
}
0
bikram sapkota

次のように、新しいテストプロジェクトを作成し、viewDidLoadViewControllerメソッド内に3つのログステートメントを書き込むだけで、テストを実行できますか。

- (void)viewDidLoad {
    NSLog(@"screens = %@", [UIScreen screens]);
    NSLog(@"self.frame= %@", NSStringFromCGRect([[UIScreen mainScreen] bounds]));
    NSLog(@"self.view.frame= %@", NSStringFromCGRect(self.view.frame));
}

ビルドして実行-デバイス/画面/ビューの実際の解像度を取得します

出力例

2015-02-11 12:45:19.116 Test[1558:87057] screens = (
    "<UIScreen: 0x7ff0b970bcc0; bounds = {{0, 0}, {375, 667}}; mode = <UIScreenMode: 0x7ff0b961b500; size = 750.000000 x 1334.000000>>"
)
2015-02-11 12:45:19.117 Test[1558:87057] self.frame= {{0, 0}, {375, 667}}
2015-02-11 12:45:19.117 Test[1558:87057] self.view.frame= {{0, 0}, {375, 667}}
0
Sanjay Mohnani

私もあなたが直面したのと同じ問題に直面しています。ビューコントローラーの幅は320だと思います。ビューのロード後、少し遅れて1つのメソッドを呼び出し、現在のビューのフレームまたはビューのバインドを取得します。あなたは正しいフレームを手に入れます。

-(void)viewDidLoad
{
    [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(getMyFrame) userInfo:nil repeats:NO];
    [super viewDidLoad];
}
-(void)getMyFrame
{
    NSLog(@"%f", [[self view] bounds].size.width);
}
0
Nirmalsinh

使用する:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
    NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);
}
0
Nick

いくつかの理由から、画面の境界に依存するほうがよいでしょう。異なるデバイスに対して正確な値を返します。

NSLog(@"Width: %f Height: %f"
      ,[[UIScreen mainScreen] bounds].size.width
      ,[[UIScreen mainScreen] bounds].size.height);
0
Naveed Abbas