在 xib 文件视图之外设置视图以适应滚动视图 + 不同的 xib 用于方向 - iOs

Posted

技术标签:

【中文标题】在 xib 文件视图之外设置视图以适应滚动视图 + 不同的 xib 用于方向 - iOs【英文标题】:Setting up views beyond the xib file's view to fit into a scroll view + Different xib for orientations - iOs 【发布时间】:2011-07-19 12:05:47 【问题描述】:

我有一个 UIScrollView,其中包含一个视图控制器,其中包含几个控制器 - 文本字段、按钮、图像等... 当它以纵向模式显示时,我希望它表现得好像没有滚动视图(当然,它仍然存在,但禁用了滚动和弹跳等,内容大小是应用程序框架的大小),并且自定义视图只是正常显示,但是当切换到横向时,我想让滚动视图可用以避免用户界面紧张。

由于本地化原因,我想为纵向/横向模式使用特定的 xib 文件,而不是使用代码以不同方式放置对象 我在这样做时遇到了 3 个问题:

1)我无法在旋转时找到一种方法来加载并应用到控制器上的不同 xib(我也希望它是一个平滑的过渡,但现在不那么重要)

2) 我找不到在 xib 文件中设置应用程序框架之外的东西的方法(我没有直接在滚动视图中的按钮等,而是在滚动视图内的自定义视图中) , 所以我不能在滚动视图的不可见部分(需要滚动才能看到的部分)放置任何东西

3)我找不到通过 xib 文件指定滚动视图内容大小的方法,这是使界面尽可能灵活地进行本地化所必需的。

您对如何实现/解决这些需求有任何想法吗?

提前致谢!

【问题讨论】:

【参考方案1】:

我建议做你说过不会做的第一件事:

我想为纵向/横向模式使用特定的 xib 文件,而不是 使用代码以不同方式放置对象

我花了很多时间尝试将不同的 XIB 用于不同的方向,但这是交易:

1) 如果你有一个纵向的 UITextField,当你旋转到横向时,你必须确保纵向模式下的文本在横向模式下是相同的。您必须对每个对象都这样做。

2) 即使您不看第 1) 点,我也无法成功实施这两个 xibs 解决方案。我不是说你做不到,我只是根据我的经验说,我做不到。

所以,如果你至少认为做 1 xib 解决方案,我可以解释一下:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)orientation



-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    NSLog(@"My view will rotate");
    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) 
        [self viewsPositionPortrait];
     else if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation))
        [self viewsPositionLandScape];
    


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    NSLog(@"Register should rotate");
    return YES;


-(void)viewsPositionPortrait

//为您的“oneOfmyViews”创建框架以进行纵向旋转 oneOfMyviews.frame=CGRectMake(...,....,...,...);

-(void)buttonsPositionLandScape

//为您的“oneOfmyViews”创建框架以进行横向旋转 oneOfMyviews.frame=CGRectMake(...,....,...,...);


然后您可以在 viewsPosition 方法中定义视图的框架。你赢了什么?

1) 干净的代码。

2) 漂亮的过渡。

3) 轻松指定滚动视图的内容大小。

对于您的 UIViews => CustomViewController => UIScrollView 的旋转问题。 你可以这样做:

1) 在 CustomViewController 中的 UIView 中,在自定义视图(上述方法)中执行完全相同的操作。

2) 在具有您的 CustomViewControllers 的视图中,您可以执行以下操作:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    //(everything that i posted above)
    [myCustomViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

这样,您将使 customViewController 中的 UIViews 旋转。最后一个提示:禁用 autoresize-subviews 并从你的 UIViews 中取出每个自动尺寸(因为你将单独定义它们的框架)。

【讨论】:

虽然这很有帮助,但我确实在当前的应用程序中得到了 2 个 xib 文件。我对您的解决方案的问题是很难本地化它,而本地化 xib 则容易得多。我担心它会导致旋转不顺畅,但看起来完全一样。

以上是关于在 xib 文件视图之外设置视图以适应滚动视图 + 不同的 xib 用于方向 - iOs的主要内容,如果未能解决你的问题,请参考以下文章

来自 Xib 文件的 IBAction 以分离视图控制器

尝试以编程方式从一个 XIB 文件创建多个视图

根据标签长度调整从 xib 创建的视图大小

具有自适应布局的 UIScrollView

将 Storyboard 和 xib 用于同一个视图控制器?

如何动态添加自定义视图xib文件