因此,我正在为iPad构建iOS应用。该应用程序中嵌入了视频聊天。我已经进行了视频聊天,通知等。我的问题是界面。关于iOS编程,我是个菜鸟。我只是在2周前才开始这样做。抱歉,如果发布的时间过长,我只是想突出显示此处可能发生的所有事情以及我的思考过程。任何批评都欢迎。
我有一个显示大多数信息的UIWebView(称为webView)。单击按钮后,我希望调整其大小并显示一个小的新视图,该视图包含三个项目:与您聊天的人(称为imageOne),视频聊天(称为imageTwo)和挂起向上按钮(称为buttonHangUp)。如果设备以横向放置,则我希望新视图显示在右侧,其中imageOne,imageTwo和buttonHangUp处于垂直位置。如果设备是纵向的,则我希望新视图显示在底部,其中imageOne,image Two和buttonHangUp处于水平位置。
这是我的思考过程:
我继续进行第二种选择(如果有更简单的方法或者应该做其他事情,请让我知道;我想学习交易的技巧和窍门)。
我的代码如下:
(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];
}
- (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;
}
}
imageOneLandscape.origin.x = 20;
imageOneLandscape.origin.y = 20;
imageTwoLandscape.origin.x = 20;
imageTwoLandscape.origin.y = 288;
buttonHangUpLandscape.origin.x = 20;
buttonHangUpLandscape.origin.y = 556;
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;
发生了一些错误的事情:
谁能向我解释这里发生了什么,为什么发生?这让我很困惑。我认为这与在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;
};
}