xib中的自动调整大小功能失效

5
我在.xib文件中设计了简单的界面,我的应用程序的部署目标是iOS 5。当我在模拟器或设备上运行我的应用程序时,视图不会调整大小。
下面是我的.xib文件的快照。 当我尝试在模拟器中运行我的应用程序时,在4英寸模拟器中可以正常运行,但在3.5英寸模拟器中无法调整大小。 "自动调整子视图"属性已经被勾选。
下面是我的Simulaotrs的快照,第一张截图是3.5英寸的,第二张是4英寸的。 提前感谢您的帮助。

将大小设置为“无”以适应Retina 3.5全屏幕。 - SAMIR RATHOD
你是否已经集成了ScrollView?这样可以滚动页面。因为由于导航栏和标签栏控制器的存在,不可能查看整个视图。 - Manann Sseth
它不是scrollView,它只是一个简单的视图。 - Krunal
1
你期望在这两种不同的屏幕尺寸下会发生什么?你有一个图标矩阵,这不是可以通过自动调整大小掩码来重新排列的东西。你能否编辑问题,解释一下你想在每个模拟器中看到什么?例如,如果你希望在3.5英寸屏幕上所有图标更靠近一些,那么这是无法通过自动调整大小掩码实现的。 - jrturton
当设计一个用于多个屏幕的单个Xib时,我发现从3.5英寸屏幕开始更容易,添加状态栏、导航栏和选项卡栏(如果适用),然后将Xib设置为自由形式。现在你知道了Xib在最小形态下的样子。之后,只需要设置自动调整大小的设置,以及父视图是否影响其子视图的调整大小。 - user352891
显示剩余5条评论
7个回答

7
请在.xib文件中使用以下设置(416 = 480 - 20(状态栏宽度)- 44(导航栏宽度))
如果您想在iPhone 5上顶部显示图标,请使用以下图标设置:
如果您想在iPhone 5底部显示图标,请使用以下图标设置:

你提供的建议很好,你知道如何在图标和标签之间添加空格吗? - Krunal
标签 - 它是在按钮内部的标签还是带有图标和标签的按钮 - 这是不同的元素吗? - Alexander Merchi
如果您使用第一种变体,可以在UIButton中使用contentEdgeInsets、imageEdgeInsets和titleEdgeInsets属性。如果您使用第二种变体,则应在标签中使用right autoresizingMask属性。 - Alexander Merchi
它们是不同的元素,我将标签放在按钮下方。 - Krunal
你可以将相同的autoresizingMask属性设置为标签和按钮。 - Alexander Merchi
非常感谢您的帮助,Alexander,因为ScrollView的这种行为,我才得以解决问题。 - Arpit B Parekh

5
如果您想要根据上层视图自动调整和自动排序图标,请尝试在布局选项卡中进行操作
layout 或为每个布局创建自己的.xib文件 ;)

你提供的建议很好,你知道如何在图标和标签之间添加空格吗? - Krunal
在我的应用程序中,我以编程方式设置了这个。也许你可以使用一个容器视图?或者只是一个UICollectionView并设置行高^^但在这样做的同时,您可以构建第二个和第三个.xib文件。如果您不打算扩展列表而使其保持静态,则这是最简单的方法;) 如果您知道项目数将会增加,则最好使用集合视图。如果不喜欢它或必须在IOS 5.1及更低版本中使用它,我可以为类似的东西提供我的解决方案;) - geo

3

检查您是否在.xib文件中取消了自动布局选项..enter image description here


你能发布一下屏幕截图吗? - Venk

2

我曾经想用一个按钮网格来实现类似的效果。我认为你会发现iOS 5所支持的自动调整大小并不能做到这一点。最终,我使用了两个Storyboard,一个用于iOS 6设备,另一个用于iOS 5。我的应用程序委托检查主视图是否响应UIView的constraints方法(它告诉您它是否支持新的基于约束的iOS 6布局),并加载相关的Storyboard。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中可以像这样:

if (![self.window.rootViewController.view respondsToSelector:@selector(constraints)]) {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_BC_iPhone" bundle:nil];
    UITabBarController *rootController = [storyboard instantiateInitialViewController];
    [self.window setRootViewController:rootController];
}

iOS 6的Storyboard是默认加载的,但如果需要,它将被覆盖为向后兼容版本。向后兼容的故事板仅手动设置为3.5英寸的显示器,因为iPhone 5只能运行iOS 6最低版本,因此在4英寸的显示器上不需要运行向后兼容的故事板。
设置向后兼容的故事板并不需要很长时间-只需复制使用约束的iOS 6版,然后将其设置为3.5英寸的显示器,关闭约束并修复视图即可。
另一种选择是基于屏幕尺寸编程布局图标。这样做的优点是可以设计成适应任何屏幕大小,但缺点是这可能需要更多的工作量。
[编辑] 请注意,您正在使用.xib而不是Storyboards,但理论是相同的。检查UIView是否响应constraints ,然后相应地加载适当的NIB(.xib)文件。

2
解决方案非常简单。将UIVIew添加到超级视图中,然后像这样将所有图标添加到它们上面(请注意从导航控制器到选项卡栏的视图大小)。 enter image description here 这个子视图(拥有你的图标的那个)应该具有这些自动调整大小的掩码。 enter image description here 而且您的图标应该具有相同的自动调整大小的掩码。

2

您可以参考Ray WenderLich的示例来了解自动布局。这篇文章提供了一个非常简单的示例,同时还有对其进行解释。它将详细描述每一行代码中可能出现的错误。如果您已启用自动布局,则在选择视图时必须在左侧显示约束条件。


1

在我看来,根据您的布局设置和解决方案的需求,您有几个选项可供选择。

如果您正在使用自动布局,则元素上会有约束条件,即使使用调整大小,也可能无法在视图中显示所有元素。它们只是不适合。因此,在这种情况下,我建议您在480分辨率下使用滚动视图以使您的视图能够被显示。

Autolayout disabled

在您的 .h 文件中,对您的视图进行 IBOutlet 声明:
@property (strong, nonatomic) IBOutlet UIView *contentView;

在你的 .m 文件中,设置如下。
//Add scrollview
UIScrollView *scrollView=(UIScrollView *)self.view;
scrollView.contentSize=self.contentView.frame.size;
[self.view addSubview:self.contentView];

另一种解决方案是让您能够根据需要在不同的间距下放置元素,可以制作两个不同的 .xib 文件,并在 ViewController 中进行设置:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
        if([UIScreen mainScreen].bounds.size.height == 568.0)
        {
            //Use iPhone5 VC
            self = [super initWithNibName:@"RootViewController-568h" bundle:nibBundleOrNil];
        }
        else{
            //Use Default VC
            self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        }
    }
    return self;
}

如果您将您的视图控制器命名为RootViewController,那么在即将推出的iPhone5s或iPhone6屏幕尺寸扩展时,这种方式可以确保应用程序不会崩溃,虽然它看起来可能不太好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接