簡體   English   中英

self.view.bounds.size.width返回錯誤的值

[英]self.view.bounds.size.width return wrong value

我現在面臨一個非常奇怪的問題。 獲取[[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。

如果您嘗試讀取[[self view] bounds].size.width-(void) viewWillAppear:(BOOL)animated您將看到它將顯示正確的值。

- (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

有時您只需要在線程上執行此類操作。

為了我,

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

然后工作直接訪問框架/綁定。

當你錯過iPhone 6和6 Plus的啟動文件時,就會發生這種情況。 嘗試以下兩種方法之一:

  1. 在Xcode中,轉到目標,常規並在那里添加啟動屏幕(“Main”)文件。
  2. 如果您正在使用資產目錄,請轉到LaunchImages資產目錄並為兩個新iPhone添加新的啟動映像。 您可能需要右鍵單擊並選擇“添加新啟動圖像”以查看添加新圖像的位置。

iPhone 6(Retina HD 4.7)需要750 x 1334的縱向啟動圖像。 iPhone 6 Plus(Retina HD 5.5)需要分別為1242 x 22082208 x 1242縱向和橫向圖像。

請改用- (void)viewWillLayoutSubviews 看看這個: 管理視圖布局

您必須為iPhone 6和iPhone 6 Plus添加適當大小的啟動圖像。 否則這些設備將拉伸320點寬度到全屏。 因此,您報告320為寬度。 使用啟動圖像,您將獲得475或414作為寬度報告。

Use **viewDidLayoutSubviews** method

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

您可以通過簡單地創建一個新的測試項目並在ViewController viewDidLoad方法中寫下三個日志語句來進行測試,就像這樣 -

- (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}}

我也面臨着你遇到的同樣問題。 我認為你的viewcontroller是320寬度。 加載視圖后,在一段延遲后調用一個方法,然后獲取視圖的正確視圖或視圖的邊界。 你得到了正確的框架。

-(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);
}

將相關任務查看到viewWillLayoutSubviews()方法中

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

出於幾個原因,您應該更好地依賴Screen界限。 他們會為不同的設備返回准確的值。

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

使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM