在 iOS 应用程序中动态更改子视图框架

Posted

技术标签:

【中文标题】在 iOS 应用程序中动态更改子视图框架【英文标题】:Changing subviews frames dynamically in iOS app 【发布时间】:2014-05-20 07:24:35 【问题描述】:

我有一个视图,我需要动态更改其子视图的框架以响应用户操作。当视图被加载时,我像这样初始化它的子视图:

if (self.firstSubview == nil) 
    NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"FirstSubView" owner:self options:nil];
    for (UIView *view in views) 
        self.firstSubview = view;
    

然后:

[self.view addSubview:self.firstSubview];

初始化后,当我想修改子视图的框架时,我会这样做:

self.firstSubview.frame = CGRectMake(0, 80, self.firstSubview.frame.size.width, 200);

我想要做的是在用户点击按钮时调整子视图的 Y 坐标及其高度,并在用户再次点击按钮时取回子视图的原始帧。但是,我发现有时这不起作用,Y 坐标和高度似乎并不总是像我在CGRectMake 函数中所说的那样设置。看起来该函数并不总是采用绝对值,而是取决于最后一帧的值...我的意思是,看起来该帧并不总是在此函数调用后采用 Y = 80 坐标。

也许我误解了它是如何工作的:在视图的nib 文件中,我在其Simulated Metrics 中设置了顶部和底部栏,因此视图的高度应该是这些栏和 (0 ,0) 坐标应该是顶栏下方的左上角,对吧?有什么我想念的吗?每次我想改变它的框架时,我是否应该重新初始化并再次添加子视图?或者我还应该做些什么来应用框架的更改?

提前致谢

【问题讨论】:

不,您不应该每次都重新初始化您的子视图吗?您是否也为子视图使用 nib 文件?它还包含模拟指标吗? 是的,我在另一个 nib 文件中有我的子视图,该文件没有设置模拟指标... 【参考方案1】:

您发布的 for-in 循环会将数组视图中的每个元素按顺序设置到 self.firstSubview 属性中,以便在循环之后 self.firstSubview 将具有 last 一个。如果这真的是你想要的,那么这里有一个更简单的方法:

if (views.count > 0)
    self.firstSubview = views.lastObject;

或许:

for (id element in views)

    if ([element isKindOfClass:[UIView class]])
    
        self.firstSubview = element;
        break;
    

【讨论】:

以上是关于在 iOS 应用程序中动态更改子视图框架的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 YUI App 框架更改子视图

如何使用自动布局动态更改超级视图的高度

UINavigationItem 标题视图的框架

滚动 UIScrollView 会更改其子视图框架

在 Superview 中更改子视图的框架

iOS在子视图之间切换常见模式[关闭]