[英]UIScrollview setContentsize in self.view.bounds.size
[英]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的啟動文件時,就會發生這種情況。 嘗試以下兩種方法之一:
iPhone 6(Retina HD 4.7)需要750 x 1334
的縱向啟動圖像。 iPhone 6 Plus(Retina HD 5.5)需要分別為1242 x 2208
和2208 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.