因此,我正在为iPad构建iOS应用。该应用程序中嵌入了视频聊天。我已经进行了视频聊天,通知等。我的问题是界面。关于iOS编程,我是个菜鸟。我只是在2周前才开始这样做。抱歉,如果发布的时间过长,我只是想突出显示此处可能发生的所有事情以及我的思考过程。任何批评都欢迎。

我有一个显示大多数信息的UIWebView(称为webView)。单击按钮后,我希望调整其大小并显示一个小的新视图,该视图包含三个项目:与您聊天的人(称为imageOne),视频聊天(称为imageTwo)和挂起向上按钮(称为buttonHangUp)。如果设备以横向放置,则我希望新视图显示在右侧,其中imageOne,imageTwo和buttonHangUp处于垂直位置。如果设备是纵向的,则我希望新视图显示在底部,其中imageOne,image Two和buttonHangUp处于水平位置。

这是我的思考过程:

  • 我阅读了http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html#//apple_ref/doc/uid/TP40007457-CH7-SW14文章,并考虑在情节提要中创建一个替代的风景视图,当方向发生变化时会调用该视图。然后我意识到这是行不通的,因为每个WebView都是一个单独的实体,因此当用户来回切换时,WebView上的导航将不同步
  • 我意识到我应该放一个不同的视图来容纳imageOne,imageTwo和buttonHangUp。叫那个viewTwo。 viewTwo应该开始隐藏并仅在从webView调用时才出现,并应在方向改变时与其中的所有项目一起重新定位和调整大小。

  • 我继续进行第二种选择(如果有更简单的方法或者应该做其他事情,请让我知道;我想学习交易的技巧和窍门)。

    我的代码如下:
  • 我在全局变量isLandscape上做了一个苹果教程
  • 我制作了6个其他全局变量CGRect,每个变量用于保存肖像和风景(imageOnePortrait,imageOneLandscape等)中不同项目的位置。
  • 我实现了awakeFromNib,将肖像变量设置为项目的初始位置和大小
    (void) awakeFromNib
    {
    isLandscape = NO;
    
    imageOnePortrait = self.imageOne.frame;
    imageTwoPortrait = self.imageTwo.frame;
    buttonHangUpPortrait = self.buttonHangUp.frame;
    
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
    }
    
  • 我按照Apple文档中的描述实现了directionChanged方法。但是,我将UIDeviceOrientation替换为UIInterfaceOrientation,因为UIDeviceOrientation不是发送我要查找的横向/纵向方向,而是发送面朝上和面朝下的消息
    - (void) orientationChanged:(NSNotification *)notification
    {
    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
    if(UIInterfaceOrientationIsLandscape(interfaceOrientation) && !isLandscape)
    {
        CGRect temp = self.videoView.frame;
        temp.size.width = 360;
        temp.size.height = 748;
        temp.origin.x = 664;
        temp.origin.y = 0;
        self.videoView.frame = temp;
        self.imageOne.frame = imageOneLandscape;
        self.imageTwo.frame = imageTwoLandscape;
        self.buttonHangUp.frame = buttonHangUpLandscape;
        isLandscape = YES;
    }
    else if (UIInterfaceOrientationIsPortrait(interfaceOrientation) && isLandscape)
    {
        CGRect temp = self.videoView.frame;
        temp.size.width = 768;
        temp.size.height = 300;
        temp.origin.x = 0;
        temp.origin.y = 703;
        self.videoView.frame = temp;
        self.imageTwo.frame = imageTwoPortrait;
        self.imageOne.frame = imageOnePortrait;
        self.buttonHangUp.frame = buttonHangUpPortrait;
        isLandscape = NO;
    }
    }
    
  • 在viewDidLoad下,我设置了Landscape坐标的坐标(我假设这些坐标是在对directionMade函数进行任何调用之前加载的,并且它们是相对于videoView的-如果我需要相对于videoView进行设置,请更正我其他;我在情节提要中看到它们相对于videoView设置):
    imageOneLandscape.origin.x = 20;
    imageOneLandscape.origin.y = 20;
    imageTwoLandscape.origin.x = 20;
    imageTwoLandscape.origin.y = 288;
    buttonHangUpLandscape.origin.x = 20;
    buttonHangUpLandscape.origin.y = 556;
    
  • 在启动视频通话的功能下,我调整webView的大小并显示videoView:
    CGRect temp = self.webView.frame;
    
    if(isLandscape)
    {
        temp.size.width -= self.videoView.frame.size.width;
        temp.origin.x = 0;
        temp.origin.y = 0;
        self.webView.frame = temp;
    } else {
        temp.size.height -= self.videoView.frame.size.height;
        temp.origin.x = 0;
        temp.origin.y = 0;
        self.webView.frame = temp;
    }
    
    self.videoView.hidden = FALSE;
    
  • ,然后在buttonHangUp函数
  • 中执行相反的操作

    发生了一些错误的事情:
  • 当我切换方向时,videoView并不总是移动或调整大小,并且当它移动时,移动通常会延迟(在其余项目旋转后等待一秒钟)
  • 当我切换到风景时,imageOne和imageTwo被水平挤压,并且不在对齐状态,因此将它们设置为
  • 当我切换到人像时,一切似乎一直运行良好。 videoView始终位于正确的位置,其子视图也是如此(imageOne,imageTwo和buttonHangUp)。
  • 当我平放ipad时,imageOne和imageTwo从肖像视图中消失,而无需更改方向
  • 即使我将视图设置为在viewDidLoad中以其他布局显示,它们也会重置为故事板
  • 中的布局

    谁能向我解释这里发生了什么,为什么发生?这让我很困惑。我认为这与在WebView和应用程序本身的坐标之间切换的坐标系,执行的不同功能的优先顺序有关(awakeFromNib,从故事板,viewDidLoad等首次设置视图坐标),以及重绘子视图,或者结合所有这些问题,甚至可能更多。接下来,我将调查这些问题。

    我也希望有人提到实现我想要的最佳实践是什么;如我所说,我是新手,但是不幸的是,Apple文档没有涵盖我的案例中被认为是最佳实践的内容。链接到文章也将不胜感激。

    最佳答案

    好吧,您有一个疯狂的漫长问题,但是我会给您一部分,并告诉您为什么您的设备方向无法正常工作。

    您未指定要为其生成通知的对象。

    更改此:

        [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:)
    name:UIDeviceOrientationDidChangeNotification object:nil]
    

    对此:
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
            [[NSNotificationCenter defaultCenter]
             addObserver:self selector:@selector(orientationChanged:)
             name:UIDeviceOrientationDidChangeNotification
             object:[UIDevice currentDevice]];
    

    同样要注意的是,您没有利用通知中心的功能。您正在做额外的工作,而不是抓住通知中发送的实际方向。您无需每次都检查UIInterfaceOrientation,您只需从便笺中获取设备方向即可,如下所示:
    - (void) orientationChanged:(NSNotification *)note
    {
        UIDevice *device = note.object;
        switch(device.orientation)//do whatever you want in each orientation
        {
            case UIDeviceOrientationPortrait:
                break;
            case UIDeviceOrientationPortraitUpsideDown:
                break;
            case UIDeviceOrientationLandscapeLeft:
                break;
            case UIDeviceOrientationLandscapeRight:
                break;
            default:
                break;
        };
    }
    

    10-08 08:11