报告横向模式中的错误边界

Kri*_*ris 24 iphone cocoa-touch objective-c uikit

我在iPad应用程序中遇到了横向模式的问题.

我创建了一个非常小的新项目来显示我的问题我将pList中的UIInterfaceOrientation设置为UIInterfaceOrientationLandscapeRight

在app delegate中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [self.window makeKeyAndVisible];
    MyController *myController = [[MyController alloc] init];
    [self.window addSubview:myController.view];

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

在MyController中

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"Bounds Height:%f %f", self.view.bounds.size.height, self.view.bounds.size.width);
}
Run Code Online (Sandbox Code Playgroud)

我也试过在viewDidLoad中使用相同的结果

如果我在横向保持设备的同时启动应用程序NSLog输出

Bounds Height: 1004.000000 Bounds Width: 768.000000
Run Code Online (Sandbox Code Playgroud)

我需要做些什么才能获得正确的结果?我是这个iOS编程的新手,我要做的就是将UISlider锚定到屏幕的底部,但是当我得到不正确的坐标时,我不确定该怎么做.

Rac*_*elD 58

我不认为原来的问题在这里得到了回答,因为我遇到了同样的问题.

这里的关键是,如果模拟器/设备处于横向模式,然后启动程序,则self.view.(框架或边界)将检索纵向高度和宽度.如果您的程序已在运行,然后您旋转它会给出正确的值.仅当在横向启动设备且未旋转设备时才会发生这种情况.

有没有其他人找到解决方案或知道我做错了什么?求求你了,谢谢你.

可能解决方案

我之前从viewDidLoad方法调用了我的方法.事实证明,视图仍在转变.通过从一切完成后调用的viewDidAppear调用我的函数,我运气更好.

希望有所帮助.

  • 尝试在`viewWillAppear`之后和`viewDidAppear之前调用的`viewDidLayoutSubviews` (5认同)
  • ViewDidAppear为我做了诀窍.谢谢. (2认同)
  • ViewWillAppear而不是ViewDidLoad为我做了.好东西. (2认同)

occ*_*lus 12

你过早地检查框架和边界大小.

而是在轮换后检查它们:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    NSLog(@"Bounds %@", NSStringFromCGRect(self.view.bounds));
    NSLog(@"Frame %@", NSStringFromCGRect(self.view.frame));
}
Run Code Online (Sandbox Code Playgroud)

(注意我的用法NSStringFromCGRect- 方便!)

这会产生输出:

Bounds {{0, 0}, {1024, 748}}
Frame {{0, 0}, {748, 1024}}
Run Code Online (Sandbox Code Playgroud)

所以在这个输出中框架是"错误的",但边界是你所期望的.事实上,框架实际上并没有错,这就是框架 - >边界计算的发生方式.所以你需要访问边界.

另请参阅或许我对UIKit中的帧和边界有正确的理解吗?

NB viewDidAppear比你在事物计划中想象的要快.根据Apple文档:"viewDidAppear通知视图控制器其视图已添加到窗口中." 换句话说,它可以在应用任何旋转之前发生.

  • 你的头像似乎符合主题. (4认同)

Sam*_*Sam 10

我有同样的问题,并像这样黑客攻击:

- (CGSize)getRotatedViewSize
{
    BOOL isPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);

    float max = MAX(self.view.bounds.size.width, self.view.bounds.size.height);
    float min = MIN(self.view.bounds.size.width, self.view.bounds.size.height);

    return (isPortrait ? 
            CGSizeMake(min, max) : 
            CGSizeMake(max, min));            
}
Run Code Online (Sandbox Code Playgroud)