私は今、非常に奇妙な問題に直面しています。取得 [[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
スプラッシュ画面もある。
ビューの実際のサイズを取得するにはどうすればよいですか?
使用する
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
の代わりに
NSLog(@"%f", [[self view] bounds].size.width);
それはあなたが期待したw/hを与えます。
-(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
_
mainスレッドでそのようなことをするだけでよい場合もあります。
私のために、
DispatchQueue.main.async {
//access to the frame/bounds
}
次に、フレーム/バインドに直接アクセスして動作します。
代わりに- (void)viewWillLayoutSubviews
を使用してください。これを見てください: Managing View Layout
これは、iPhone 6および6 Plusのlaunchファイルがないために発生しています。次の2つの方法のいずれかを試してください。
IPhone 6(Retina HD 4.7)には、750 x 1334
の縦向きの起動画像が必要です。 iPhone 6 Plus(Retina HD 5.5)では、それぞれ1242 x 2208
と2208 x 1242
のサイズの縦向きと横向きの画像が必要です。
IPhone 6およびiPhone 6 Plusに適切なサイズの起動画像を追加することは絶対に必要です。そうでない場合、これらのデバイスは全画面に320ポイントの幅を拡大します。したがって、320が幅として報告されます。起動画像を使用すると、475または414が幅として報告されます。
Use **viewDidLayoutSubviews** method
override func viewDidLayoutSubviews() {
print("Size of View: \(view.bounds)")
}
関連するタスクをviewWillLayoutSubviews()メソッドに表示します
override func viewWillLayoutSubviews() {
print("view Size: \(view.bounds.width)")
}
次のように、新しいテストプロジェクトを作成し、viewDidLoad
のViewController
メソッド内に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}}
私もあなたが直面したのと同じ問題に直面しています。ビューコントローラーの幅は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);
}
使用する:
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);
}
いくつかの理由から、画面の境界に依存するほうがよいでしょう。異なるデバイスに対して正確な値を返します。
NSLog(@"Width: %f Height: %f"
,[[UIScreen mainScreen] bounds].size.width
,[[UIScreen mainScreen] bounds].size.height);