所以,我正在为 iPad 构建一个 iOS 应用程序。该应用程序中嵌入了视频聊天。我已经得到了视频聊天、通知等所有工作。我的问题是界面。顺便说一句,我是 iOS 编程的菜鸟;我两周前才开始这样做。抱歉,如果这篇文章有点长,我只是想强调一下这里可能发生的一切以及我的思考过程。欢迎任何批评。
我有一个显示大部分信息的 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 a la apple tutorial
- 我制作了 6 个其他全局变量 CGRects,每个变量用于保存纵向和横向中不同项目的位置(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]; }
我按照苹果文档中的描述实现了orientationChanged 方法。但是,我将 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 坐标的坐标(我假设这些坐标是在调用orientationMade 函数之前加载的,并且它们是相对于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 等)以及重新绘制子视图,或者结合所有这些问题,可能还有更多。接下来我将调查这些问题。
我也很感激有人提到实现我想要的最佳实践是什么;正如我所说,我对此并不陌生,不幸的是,苹果文档并未涵盖就我的案例而言被认为是最佳实践的内容。文章链接也将不胜感激。