UITableView开始执行动画但跳回到原始位置

时间:2014-12-24 23:41:02

标签: ios uitableview cocoa-touch core-animation uiviewanimation

我正在用objective-c编写我的第一个iOS应用程序,而且我已经在这几天抓住了这个问题。我住在缅因州海岸的一个小岛上,我正在设计的应用程序将允许用户(或者很可能只是我)选择一个岛屿,选择出发日期,并查看离开大陆的船只的相应渡轮时间表。

问题在于:

为了显示正确的渡轮时间表,用户必须能够选择他们想要离开的日期以及他们要离开/前往的岛屿。根据对question的回应给出的建议,我选择使用位于导航栏下方的四行表视图来实现此功能。在任何时候都显示这些行中的至少两个:dateCell(在行0中)显示当前选择的日期,以及显示当前所选岛的islandCell(在行2中)。如果用户选择dateCell,则会显示第1行(包含内联UIDatePicker),允许他们更改日期。再次选择dateCell会隐藏日期选择器。如果用户选择岛单元格,则会出现第3行(其中包含带有所有可用岛的列表的内联UIPickerView),允许它们更改岛。关于这个过程的一切都很好。

当我决定在用户​​向下滚动显示在其下方的时间表时,我希望该表保持固定(不滚动)时,我的挑战就出现了。我通过在UIView中嵌入两个表视图来实现这一点:一个用于岛/日期单元及其选择器,一个用于计划。两个表都运行良好。

问题是,当没有显示拣货员时,我希望时间表视图能够掩盖/隐藏拣货台视图中浪费的房地产。为了做到这一点,我添加了一些动画,我认为会重新定位日程表视图的框架,具体取决于拾取器是否打开。这似乎很简单,然而,动画并没有像我预期的那样执行。它们开始执行,并且计划表视图开始相应地向上或向下滑动,但动画总是突然停止并且计划跳回到它的原始位置。从播放动画的持续时间开始,我相信一旦显示选择器视图的动画完成,它就会跳回原来的位置。我的问题是我没有调用选择器视图动画(它们是自动执行的)所以我不知道如何访问它们以确定是否存在某种干扰。

这是隐藏和显示拣货员的方法:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    CGFloat heightForRow = self.pickerTableView.rowHeight;

    if (tableView == self.pickerTableView) {

        // if the index path row is the row of the datePicker (1) or the islandPicker (3), and the    date picker should be shown, return the height for the picker. If it should be hidden, return 0.0
        if (indexPath.row == 1) {

            heightForRow = (self.isDatePickerShown) ? self.pickerCellRowHeight : 0.0;
            return heightForRow;

         } else if (indexPath.row == 3) {

            heightForRow = (self.isIslandPickerShown) ? self.islandPickerCellRowHeight : 0.0;
            return heightForRow;

        } else {

            // else, return the default height for a picker table row
            return heightForRow;
        }

    } else { // the table view must be the schedule table view

        // return the default height for a schedule table row
        return heightForRow;
    }

}

这是调度表查看动画的方法的第一部分:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    // if the selected cell is a date cell
    if (cell.reuseIdentifier == kDateCellID)
    {

        // log the datePicker's indexPath
        NSInteger rowToReveal = indexPath.row + 1;
        self.datePickerIndexPath = [NSIndexPath indexPathForRow:rowToReveal inSection:0];

        // move and animate schedule table view accordingly
        if (self.datePickerIsShown == NO && self.islandPickerIsShown == NO)
        {

            // drop the schedule table view down to accomodate change in picker table view
            CGRect newFrame = self.scheduleTableView.frame;
            newFrame.origin.y += self.pickerCellRowHeight;    // shift down by the height of the date Picker Cell

            [UIView animateWithDuration:0.3
                             animations:^{
                                 self.scheduleTableView.frame = newFrame;
                             }];

            // toggle the date picker to display it
            self.datePickerIsShown = ! self.datePickerIsShown;

        } else if (self.datePickerIsShown == NO && self.islandPickerIsShown == YES){

            // toggle the island picker to hide it
            self.islandPickerIsShown = ! self.islandPickerIsShown;

            // toggle the date picker to display it
            self.datePickerIsShown = ! self.datePickerIsShown;

        } else {

            // the date picker is being retracted, so raise the schedule table view up to conceal bottom of picker table view
            CGRect newFrame = self.scheduleTableView.frame;
            newFrame.origin.y -= self.pickerCellRowHeight;    // shift up by the height of the date Picker Cell

            [UIView animateWithDuration:0.3
                             animations:^{
                                 self.scheduleTableView.frame = newFrame;
                             }];

            // toggle the date picker to hide it
            self.datePickerIsShown = ! self.datePickerIsShown;
        }

        // update pickerTableView
        [tableView beginUpdates];
        [tableView endUpdates];

之前有没有人遇到过这个问题?有没有人知道在显示UIPickerViews或UIDatePickers时会调用什么动画?我如何确定这是否是导致计划表恢复到其原始位置的原因?

我已经在我的桌子上撞了三天了。我想要的圣诞节就是让这些动画做他们应该做的事情!

提前致谢。

-Nathaniel

0 个答案:

没有答案