横向模式下的iPhone应用程序,2008系统

注:这个问题是从2008年开始的,现在只有历史意义。


无论设备的位置如何,创建一款从横向模式运行的iPhone应用程序的最佳方式是什么?

以编程方式并使用Interface Builder。

0
额外 编辑
意见: 1
您是否尝试更改多边形使用的符号系统?对于多边形的轮廓线,请选择制图线符号, - 将轮廓线符号偏移量设置为负数(在“线属性”选项卡上)。
额外 作者 saint_groceon,
对于任何未来的读者,请注意,这个着名的问题现在由Apple 于2011年解决。注意下面答案中的测试项目。
额外 作者 Fattie,
是。与此相关的问题是,在各种奇怪的上/下冲和尖峰发生之前,你不可能比边界线上的几个点更宽。 示例图,取自偏移粗线上的尖峰线程。
额外 作者 Greg,
@matt出于可视化的目的,在符号化之后,通过制图表达
额外 作者 DavidWhitney,

8 答案

使用分析工具箱中的缓冲工具并为缓冲距离输入一个负值。为边类型选择 OUTSIDE_ONLY ,然后解散相关属性。

需要高级许可证。

一旦属性缓冲区存在,我们可以使用定义查询仅显示特定的FN和/或用单独的符号显示每个符号,所有符合单个要素类。

buffer tool with relevant fields highlighted Using separate symbol for each feature class

7
额外

来自Apple Dev站点:

To start your application in landscape mode so that the status bar is in the appropriate position immediately, edit your Info.plist file to add the UIInterfaceOrientation key with the appropriate value (UIInterfaceOrientationLandscapeRight or UIInterfaceOrientationLandscapeLeft), as shown in Listing 2.

Listing 2: Starting your application in landscape mode

UIInterfaceOrientation
UIInterfaceOrientationLandscapeRight
0
额外
该问题询问如何以横向模式启动设备。答案给出了这些信息。问题中没有提到处理方向。 +1 Michael Pryor
额外 作者 ingh.am,
有趣的是,“答案”实际上不会以横向模式启动设备 - !!这可能是Apple在所有环境中最着名的bug /难度。这是iPad开发人员的基本工作!
额外 作者 Fattie,
@mbehan还有UIInterfaceOrientationPortraitUpsideDown,因此不是一个修复。此外,.plist中的UIInterfaceOrientation仅支持3.2+,而不支持3.1.3及更旧版本的设备(并且记住iPhone 2G在该版本中保留)。
额外 作者 Ivan Vučica,
这在你的shouldAutorotateToInterfaceOrientation方法中返回(interfaceOrientation!= UIInterfaceOrientationPortrait);你完成了。
额外 作者 mbehan,

只有历史答案。壮观地过时:

请注意,这个答案现在已经过时了。

本文仅历史好奇心


令人兴奋的消息!正如下面Andrew发现的,这个问题已经被苹果公司在4.0以上修复了。

似乎不再需要在每个视图上强调观点的大小,并且“仅第一次工作”的具体严重问题已经得到解决。

截至2011年4月,不可能测试或者甚至不能构建低于4.0的任何东西,所以这个问题纯粹是一种历史的好奇心。令人难以置信的是,它给开发者带来了多少麻烦!


这是最初的讨论和解决方案。现在这完全不相关,因为这些系统甚至不可操作。


完成这项工作极为困难 - 至少存在三个问题/缺陷。

try this .. interface builder landscape design

特别要注意的是,它说“并且你需要在所有地方正确使用shouldAutorotateToInterfaceOrientation”它意味着无处不在,所有全屏视图。

希望它在这个噩梦中有所帮助!

这里提供了另一个众所周知的问题:如果您试图在 多个 视图(全部横向)之间进行交换,则 它简单不起作用 。记住这一点很重要,否则你会浪费几天时间解决问题。这实际上是不可能的。这是iOS平台上最大的公开的已知错误。从字面上看,没有办法让硬件制作你加载的第二个视图,是风景。烦人但简单的解决方法,你必须做的是有一个微不足道的大师UIViewController,除了坐在那里,让你在你的视图之间切换。

换句话说,在iOS中由于一个主要的知道bug:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

You can do that only once. Later, if you try to remove happyThing.view, and instead put in there newThing.view, IT DOES NOT WORK - AND THAT'S THAT. The machine will never rotate the view to landscape. There is no trick fix, even Apple cannot make it work. The workaround you must adopt is having an overall UIViewController that simply sits there and just holds your various views (happyThing, newThing, etc). Hope it helps!

0
额外
我相信这已在4.x中得到修复。我们发布了一个游戏,其中包含一堆不同的屏幕,一些风景和一些肖像,但它在3.x中无法使用。不想进入额外的虚拟视图来处理它,我们反而需要4.x--在问了这个问题一年后,它可能是好的。
额外 作者 AndrewS,
我们没有做“总是风景”,而是各种风景或肖像。每个VC都直接添加到窗口并从中移除。应用程序启动横向,通过几个屏幕过渡停留。我们不使用虚拟视图,但是我们会在每个屏幕上覆盖shouldAutorotate。在4.x上没有任何问题,从触摸板到手机。
额外 作者 AndrewS,

首先我在info.plist中设置

UIInterfaceOrientation
UIInterfaceOrientationLandscapeRight

然后我把这段代码放在applicationDidFinishLaunching中:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

这样我可以在界面生成器中以横向模式处理视图。

0
额外

所有帖子的摘要和整合,经过我自己的测试;检查下面4.x,5.x的更新。

从3.2开始,您无法从代码更改正在运行的应用程序的方向。

但是你可以用固定的方向开始一个应用程序,尽管这样做并不简单。

试试这个配方:

  1. set your orientation to UISupportedInterfaceOrientations in the Info.plist file
  2. in your window define a 480x320 "base view controller". Every other view will be added as a subview to its view.
  3. in all view controllers set up the shouldAutorotateToInterfaceOrientation: method (to return the same value you defined in the plist, of course)
  4. in all view controllers set a background view with

    self.view.frame = CGRectMake(0, 0, 480, 320)

    in the viewDidLoad method.

Update (iOS 4.x, 5.x): the Apple iOS App Programming Guide has a "Launching in Landscape Mode" paragraph in the "Advanced App Tricks" chapter.

参考文献:

0
额外
我喜欢这个问题的链接如何回到这个问题。
额外 作者 Richard J. Ross III,
我可以确认这是唯一的,真正有效的解决方案(只有一小部分)。我花了几个小时才找到并评估这件事。所有其他答案只是问题的部分解决方案。
额外 作者 Johannes Rudolph,
Ty Richard,去掉了循环链接
额外 作者 IlDan,

sasb's和michaelpryor的答案似乎是正确的,但如果它不适合你,请尝试以下方法:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

或者这个:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

或者这个:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

您可能还必须首先调用 window makeKeyAndVisible;

A few links: Developing in landscape mode, iPhone SDK: How to force Landscape mode only?

@Robert:请参阅 iPhone SDK,NDA和堆栈溢出

0
额外

我很惊讶没有人拿出这个答案呢:

在我所有的测试中,当解除模式视图控制器时,即使在UINavigationController的一部分中,也可以遵守 shouldAutorotateToInterfaceOrientation 中设置的父视图控制器的首选方向。所以解决这个问题很简单:

创建一个具有UIImageView的虚拟UIViewController作为背景。将图像设置为您的应用在启动时使用的default.png图像。

当在你的根视图控制器中调用 viewWillAppear 时,只显示没有动画的哑视图控制器。

当在您的虚拟视图控制器中调用 viewDidAppear 时,使用一个不错的交叉消解动画关闭视图控制器。

这不仅工作,而且看起来不错!顺便说一句,只是澄清我做的根视图控制器的 viewWillAppear 是这样的:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}
0
额外

See this answer: Landscape Mode ONLY for iPhone or iPad

  1. 将定位添加到plist
  2. 所有文件中的shouldAutorotateToInterfaceOrientation = YES

虽然如果你使用混合模式,你可能会更好

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
0
额外