自动将视图放在下一个逻辑位置(如布局管理器)

时间:2011-05-28 06:28:27

标签: objective-c xcode ios ipad

我正在开发一款iPad应用程序,允许用户选择“小部件”显示在屏幕上。屏幕分为两列,小部件将放在左列或右列中。每个小部件都是一个视图控制器,具有静态固定宽度,但根据小部件的内容而变化的高度。我正在寻找一种方法将小部件放在屏幕上,以便它们自动放置在下一个逻辑位置 - 类似于Java中的布局管理器。

我创建了方法addWidget,它跟踪每列中所有小部件的高度。然后将小部件添加到具有最小高度的列中。这个有效,但我正在寻找一种更优雅的方式,或者是改进当前解决方案的想法。

- (void) addWidget:(UIViewController *)controller {

    if(leftHeight <= rightHeight) {
        controller.view.frame = CGRectMake(20.0, leftHeight, controller.view.bounds.size.width, controller.view.bounds.size.height);
        leftHeight = leftHeight + controller.view.bounds.size.height + 20;
    }

    else {
        controller.view.frame = CGRectMake(self.view.bounds.size.width-controller.view.bounds.size.width-20, rightHeight, controller.view.bounds.size.width, controller.view.bounds.size.height);
        rightHeight = rightHeight + controller.view.bounds.size.height + 20;
    }

    [scrollView addSubview:controller.view];
}

由于

2 个答案:

答案 0 :(得分:1)

我认为这可以使用两个UITableView对象,每个对应一个。当你来添加一个新的控件时,你仍然需要做数学来决定它进入哪个列,但你应该有一个更容易的时间来垂直布局单元格,因为表格视图可以做到这一点。如果您当前正在同时滚动两个列,则需要观察每个表格视图滚动并以编程方式更新另一个列。

答案 1 :(得分:1)

如果您正在为您的小部件提供类似“跳板”的视图,我建议您查看Three20框架。

它提供了一个[TTLauncherView][2]类,可以实现您正在寻找的内容,包括分页,重新排序图标以及删除时的抖动效果 - 就像真正的Springboard一样。一旦你学会了Three20,它就很容易使用。

顺便说一句,它是官方Facebook应用程序使用的那个......

如果你不想使用Three20,你可以简单地看一下实现,以便下定决心。