iPad / iPhone多方位最佳实践?

时间:2010-11-23 07:14:39

标签: iphone objective-c ipad interface-builder

我想将我的观点转换为适合任何方向的工作(特别是因为它推荐用于iPad)。我一直在使用IB来解决问题,我不确定如何最好地继续下去。

我理想的是在IB中旋转视图,重做布局,并将两个方向保存到同一个XIB,以便视图自动知道方向更改时要执行的操作。这似乎不可能。

我知道当方向改变时我可以在代码中重新排列视图,但是使用IB没有多大意义,因为我的一个主要优点是将所有丑陋的布局代码与我的逻辑分开。 / p>

其他人为此做了什么?他们只是设计他们的视图,以便UIViewAutoResizing标志可以适当地处理旋转吗?他们是否有针对每个方向的多个视图,并以某种方式平滑地切换它们?

3 个答案:

答案 0 :(得分:5)

您可以在同一个XIB中创建两个单独的视图,然后实现以下代码:

@interface

IBOutlet UIView *landscapeView;
IBOutlet UIView *portraitView;

@implementation

- (void) viewDidLoad {
self.view.frame = [[UIScreen mainScreen] applicationFrame];
  landscapeView.autoresizesSubviews = NO;  <- IMPORTANT!
  portraitView.autoresizesSubviews = NO;   <- IMPORTANT!
}
- (BOOL)shouldAutorotateToInt .... {
  if ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight) self.view = landscapeView;
  else if ((interfaceOrientation == UIInterfaceOrientationPortrait) || (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) self.view = portraitView;
  return YES;
}

答案 1 :(得分:5)

我在这里(以及关于这个主题的StackOverFlow上的其他地方)找到了这些信息,这让我想到了我以前的答案。如果你有很多顶级对象,这就变得乏味。

然后,我想到你可以创建一个“帮助者”对象,所以我创建了一个项目来演示这种技术。基本上,帮助者在视图中具有针对每个感兴趣对象的出口。 ViewController本身有两个Helper对象(一个用于p,一个用于l),你可以在NIB中实例化它们。在方向更改时,将视图控制器的帮助程序指针切换到相应的帮助程序,然后更新self.view。它非常简单(这篇文章更难)。

那么,你会怎么开始?如果您事先知道需要两个单独的视图,那么它会有所帮助。一旦您知道,请在下面引用的项目中使用Helper模板,进行调整,将其添加到NIB,然后将帮助连接到纵向视图中的相应对象。 View Controller本身只是对两个助手的引用,以及一个“curHelper”指针。 Helper ivars是公共的,因此View Controller可以引用像“curHelper-&gt; label1.text = ...”这样的项目 - 成本是单指针解除引用(也可以只使用属性 - 你的调用)。

此外,您可以在任一视图中直接连接对象的IBActions。所以,让我们来看看:

  • 创建NIB
  • 创建一个Helper对象,并在名为Portrait
  • 的nib中实例化一个
  • 将所有IBOutlets添加到Helper对象,然后在dealloc中处理,viewWillUnload
  • 在视图控制器中正常放置IBActions
  • 连接NIB - Helper-&gt;纵向视图插座,操作到视图控制器
  • 让所有人都在使用Portrait
  • 添加一个新的Helper对象,称之为Landscape
  • 复制当前纵向视图,旋转并保存
  • 将景观助手的出口连接到新的景观视图(已为您设置的操作!)

显然你需要从现在开始进行重复更改,但在任何双笔尖方案中你都必须这样做。在上述技术中,所有插座名称保持不变。

View Controller需要在收到帮助者时向其发送“viewDidUnload”,并释放Helpers(然后释放他们的出口)。

注意:我只是把它放在一起看看它看起来如何。如果你想看到代码和一个非常小的演示,你可以从名为Helpers.zip的iPhone文件夹中的public dot me dot com slash dhoerl下载它。如果需要,我会更新此文本和此文本。

答案 2 :(得分:0)

查看上面的代码,使用两个视图 - 我喜欢它。为了回应“现在我必须保留两个参考文献 - 好吧,没有一个解决方法 - 使用”引用“(我的术语)。

使用前缀l和p命名视图和出口,然后使用您现在使用的基本名称定义“伪”ivars。当您第一次viewDidLoad(或其他地方)时,将所有“伪”ivars设置为l或p varient。切换方向时,只需将伪方向设置为另一方向(以及其他操作)。

在viewDidUnload和dealloc中,只引用l和p项 - “真正的”IBOutlets - 并简单地将伪ivars取出。让它更难看 - l_no_no_no_或真正的IBOutlets前面的东西,这样你就不会无意中使用它。

如果您制作伪ivars属性,请使用ASSIGN而不是RETAIN !!!