【问题标题】:iOS Storyboard, layout shifts awkwardly between 4.0 inch screen size and 3.5 inch screen sizeiOS Storyboard,布局在 4.0 英寸屏幕尺寸和 3.5 英寸屏幕尺寸之间笨拙地转换
【发布时间】:2013-12-08 15:55:43
【问题描述】:

我在应用屏幕尺寸方面遇到问题。我关闭了自动布局,以免弄乱屏幕上的元素。

但是现在当我尝试为 3.5 英寸屏幕创建一个像这样的简单屏幕时:

但是当我在一个 4 英寸的屏幕上看到相同的布局时,它看起来都被这样的间距弄乱了:

我不明白我在这里做错了什么。如何创建在 3.5 英寸和 4.0 英寸屏幕上看起来相同的屏幕?

谢谢!

【问题讨论】:

    标签: ios storyboard autolayout


    【解决方案1】:

    Autolayout 从 Xcode 4.x 到 5.0 向前迈出了一大步。 Apple 听取开发人员的意见之一是:现在默认情况下自动布局不再创建任何自动约束。这意味着:当您拉入所有控件时,您拥有一个完整的静态布局(具有绝对坐标)(您可以在任何时间点轻松删除所有约束,以返回该状态。)。建议的工作流程是从那时起一个接一个地添加约束。这导致开发人员在任何状态下都可以完全控制。

    那是说。 我给你的建议是:打开自动布局。然后将所有控件放在 3.5 屏幕上的静态位置。如果您不想支持纵向/横向或 iPhone/iPad,那么就不要添加任何约束。这样就完成了,因为适合 3.5 屏幕的静态布局也应该适用于 4.0 屏幕。

    一旦您想支持 iPad 或具有相同场景的横向模式,请一一添加约束。真的行。自动布局现在是你的朋友(从 Xcode 5 开始)。相信我。

    【讨论】:

      【解决方案2】:

      选择您的 UITableView,然后在 Size Inspector 中,激活所有自动调整大小的箭头和线条,确保您的 tableview 是顶视图(在您的 UIViewController 视图内)。

      【讨论】:

      • 我不确定这是否能解决我的问题。所有元素都会发生变化,而不仅仅是 UITableView
      • 感谢您的意见,我觉得截图会更清楚
      【解决方案3】:

      如果您不想处理自动布局,请转到您的尺寸检查器并将您的自动调整大小更改为:

      【讨论】:

        【解决方案4】:

        非常常见的问题,我的每个应用都遇到过这个问题。

        你有两个选择

        1. 在您的故事板中,您可以从一个欢迎屏幕视图控制器拥有两个分支。一个分支将具有 4 英寸大小的所有控制器,而另一个将具有 3.5 英寸控制器。退回到这种方式是您在情节提要中为自己创造了双倍的工作。

        这就是你的做法

        • 如图所示创建布局
        • 添加两个按钮并将它们以模态方式附加到这些视图。
        • 将故事板 Segue 标识符更改为每个按钮的“iphone4”和“iphone5”。
        • 使按钮非常小(1px / 1px)并隐藏它们。删除所有默认文本。
        • 添加此代码

        在您的 *.h 中

        #import <UIKit/UIKit.h>
        
        @interface v2ViewController : UIViewController
        {
            NSTimer *timer1;
            NSTimer *timer2;
        
        }
        
        @property (nonatomic, retain) NSTimer *timer1;
        @property (nonatomic, retain) NSTimer *timer2;
        

        在你的 *.m 中添加这个

        @synthesize timer1;
        @synthesize timer2;
        - (void)viewDidLoad
        {
            [super viewDidLoad];
            // Do any additional setup after loading the view, typically from a nib.
        
            timer2 = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(moveOn) userInfo:nil repeats:NO];
        
        }
        
        - (IBAction) moveOn
        {
            //Now go to the Display Call Page
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
            {
                CGSize result = [[UIScreen mainScreen] bounds].size;
                if(result.height == 480)
                {
                    // iPhone Classic
                    [self performSegueWithIdentifier:@"iphone4" sender:nil];
                }
                if(result.height == 568)
                {
                    // iPhone 5
                   [self performSegueWithIdentifier:@"iphone5" sender:nil];
                }
            }
        
        }
        
        1. 第二个选项是添加代码,相应地调整所有视图、按钮等的大小。您需要将所有内容附加到 IBOutLet,然后执行此操作。 (抱歉,我不知道为什么 #@!$ 代码格式不起作用)

        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize 结果 = [[UIScreen mainScreen] bounds].size; 如果(结果。高度 == 480) { // iPhone经典 [weatherBGImageVw setFrame:CGRectMake(0, 0, 320, 480)]; } 如果(结果。高度 == 568) { // iphone 5 [weatherBGImageVw setFrame:CGRectMake(0, 0, 320, 568)]; } }

        【讨论】:

        • 谢谢 - 对于选项二,我是否必须将相同的确切代码添加到我的所有控制器?还是所有控制器都不同?
        • 您能解释一下我如何创建这两个分支吗?这似乎更容易,更可预测。
        • 这似乎只有当您想要在不同尺寸的屏幕上显着不同的布局时才有意义。否则,为什么不直接使用自动布局或自动调整蒙版来获得相同的效果?
        • 我尝试使用自动布局,但它在我的应用程序中几乎总是无法正常工作。对于更大的 iphone 5 屏幕,它会以奇怪的方式在 UIImageViews 中拉伸我的图形,或者将它们移动到它认为是它们的最佳位置的屏幕上,特别是对于支持横向和纵向模式的应用程序。它造成的悲伤远远超过了它的价值。
        猜你喜欢
        • 1970-01-01
        • 2014-03-30
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多