【发布时间】:2010-09-11 09:12:56
【问题描述】:
我正在为 iPhone 应用程序编写一个方法,该方法将根据该视图中的可用空间自动调整 UIViews 的子视图 Y 值。我会尽力解释,不要太混乱。
我有一个容器视图,最多可容纳 3 个子视图。在每个子视图中都有一个从容器视图中删除子视图的按钮,当子视图被删除时,我想调整剩余的子视图以占用已被删除的子视图打开的任何空间。
提前感谢您的帮助!
【问题讨论】:
标签: iphone objective-c uiview
我正在为 iPhone 应用程序编写一个方法,该方法将根据该视图中的可用空间自动调整 UIViews 的子视图 Y 值。我会尽力解释,不要太混乱。
我有一个容器视图,最多可容纳 3 个子视图。在每个子视图中都有一个从容器视图中删除子视图的按钮,当子视图被删除时,我想调整剩余的子视图以占用已被删除的子视图打开的任何空间。
提前感谢您的帮助!
【问题讨论】:
标签: iphone objective-c uiview
一种方法是让您的包装视图成为自定义 UIView 子类。在该子类中,为您的子视图维护一个单独的 NSMutableArray,其中每个子视图的数组索引对应于其在屏幕上的位置。
有了这个,你有几个选择。一种是覆盖 didAddSubview:。根据添加的子视图的框架,您可以确定子视图的位置并在数组中的适当索引处插入对子视图的引用。
更简洁的选择是实现您自己的自定义方法,如下所示:
- (void)insertSubview:(UIView *)subview atPosition:(NSInteger)position;
其中position 是标识子视图应填充哪个“槽”的索引。您可以在此方法中显式设置子视图的框架,以及受插入影响的任何其他子视图。然后将子视图插入到数组中相应索引处。
最后,覆盖 willRemoveSubview:。在其中,您可以在数组上使用indexOfObject: 来查找要删除的子视图的位置。然后简单地调整所有跟随它的子视图的框架,并从你的数组中删除子视图。
(另一种选择是跳过数组,只使用tag 属性来指示每个子视图的位置。不过我不喜欢这个选项。使用tag 属性做任何事情总是感觉很糟糕攻击我。)
【讨论】:
您需要做的第一件事是向您的容器发出一个子视图已被删除的信号。
然后你可以取被移除的视图的高度值,除以剩余子视图的数量,然后扩大剩余子视图的高度。
然后将剩余的第一个子视图设置为 Y 坐标 0,将第二个(如果有)设置为第一个子视图高度值的 Y 坐标
【讨论】: