0

问题一:

如何获得正确大小的 UIView?

我正在创建一个 CGRect 来使用平铺层显示一些图像。当我创建 CGRect 时,我基本上需要它的大小与我的 UIView 的大小完全相同。事实证明这很困难.. 当我 NSLog() 输出 mymainView.bounds.size.width或 mymainView.frame.size.width时,它们在横向时总是错误的!他们总是像在纵向一样注销值,即使我可以看到实际视图更宽。颠倒它们也将是错误的。在横向时将宽度设置为高度是不够的,反之亦然,我需要正确的值。

我能够使它看起来正确的唯一方法是在横向时手动输入 1024 的宽度,但这也并不总是有效,因为:

问题2:

检查设备是否处于横向状态的正确方法是什么?

我一直在使用

if([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft || [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight)

但这并不总是有效。如果我在启动时将设备保持在横向模式,这是正确的,但是如果我将其设为横向,则将 iPad 平放,将仪表板保持为横向,然后启动它,然后会出现横向飞溅,但该代码认为它是纵向的。该代码也根本不适用于 iPad 模拟器..

编辑

出于某种原因,当我决定添加对横向方向的支持时,仅检查目标摘要页面中的横向方向是不够的,我实际上必须将我的 TabBarController 子类化并以物理方式告诉它旋转和

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return YES;
}

我不应该这样做..对吗?如果我创建一个这样的空项目,它就不需要它。我不知道为什么。

4

2 回答 2

1

问题1:是的,没错。:)

问题 2:我刚回到家并检查了自己的代码。我用:

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

检查当前界面的方向。然后,你可以使用类似的东西:

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
    // Do something
} else if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){
    // Do something else
}

但是,如果您正确处理旋转事件,您真的不需要这样做。

当我需要根据方向调整代码中的 UI 元素位置时,这是我处理旋转的典型方式:

#pragma mark - View rotation methods

// Maintain pre-iOS 6 support:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

// Make sure that our subviews get moved on launch:
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    [self moveSubviewsToOrientation:orientation duration:0.0];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    [self moveSubviewsToOrientation:toInterfaceOrientation duration:duration];
}

// Animate the movements
- (void)moveSubviewsToOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
{
    [UIView animateWithDuration:duration
                     animations:^{
                         [self.tableView reloadData];
                         if (UIInterfaceOrientationIsPortrait(orientation))
                         {
                             [self moveSubviewsToPortrait];
                         }
                         else
                         {
                             [self moveSubviewsToLandscape];
                         }
                     }
                     completion:NULL];
}

- (void)moveSubviewsToPortrait
{
    // Set the frames/etc for portrait presentation
    self.logoImageView.frame = CGRectMake(229.0, 21.0, 309.0, 55.0);
}

- (void)moveSubviewsToLandscape
{
    // Set the frames/etc for landscape presentation
    self.logoImageView.frame = CGRectMake(88.0, 21.0, 309.0, 55.0);
}

我也投入moveSubviewsToOrientation让它viewWillAppear旋转

于 2013-01-11T23:21:22.967 回答
1

我对此有点挣扎,以下是我发现的一些事实:

1- 当设备正面朝上或朝下时,设备会恢复到正面朝上或朝下之前的最后一个方向,因为这两个方向不一定会告诉您设备是纵向还是横向。例如,如果您处于横向模式,然后将设备平面朝上,然后启动应用程序,它将以横向启动。

2- 调用 viewDidLoad 时,尚未设置边界,因此您需要在 viewWillAppear 或 viewDidLayoutSubviews 中放置与方向有关的任何调用。

3-如果出于某种奇怪的原因,您需要在 viewDidLoad 之前使用边界,或者可能在模型中执行某些操作,我发现放置与方向有关的设置的最佳方法是信任状态栏,您可以例如如下调用。

if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))

PS:关于你添加的问题,参考: https ://developer.apple.com/library/ios/#qa/qa2010/qa1688.html

您很可能是最后两颗子弹中的一颗。我之前遇到过这个问题,坦率地说,我发现它最容易实现:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;

对于所有 VC 来说,只是为了安全起见,尤其是行为已从 iOS5 更改为 iOS6。

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html#//apple_ref/doc/uid/TP40007457-CH7-SW1

希望这可以帮助

于 2013-01-11T23:31:39.477 回答