在解除模态视图后,UITableView和背景图像向下移动

时间:2011-08-11 23:17:59

标签: iphone objective-c xcode uitableview

我有一个带有标签栏和表格视图的视图。在某一点上我调用模态视图,当我解除它时,原始视图似乎拉伸或向下移动,因为背景图像较低并且表视图较长到最后一个单元格超出框架的点

我从tableView:didSelectRowAtIndexPath

调用模态视图
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSMutableDictionary *row        = [[[[self.productDetails valueForKey:@"sections"] objectAtIndex:indexPath.section] valueForKey:@"rows"] objectAtIndex:indexPath.row];
    NSMutableDictionary *post       = [self.productDetails valueForKey:@"post"];
    if ([[row valueForKey:@"type"] isEqualToString:@"pick"])
    {
        self.xPicker                = nil;
        self.xPicker.options        = nil;
        self.pickerOptions          = nil;
        self.xPicker                = [[[TablePicker alloc] initWithNibName:@"TablePicker" bundle:[NSBundle mainBundle]] autorelease];
        NSMutableDictionary *newPicker  = [[[NSMutableDictionary alloc] init] autorelease];
        [newPicker setValue:[NSString stringWithFormat:@"%d", indexPath.section] forKey:@"section"];
        [newPicker setValue:[NSString stringWithFormat:@"%d", indexPath.row] forKey:@"row"];
        [newPicker setValue:[row valueForKey:@"options"] forKey:@"options"];
        [newPicker setValue:[row valueForKey:@"value"] forKey:@"value"];
        self.xPicker.options        = [NSMutableDictionary dictionaryWithDictionary:newPicker];
        self.pickerOptions          = [NSDictionary dictionaryWithDictionary:newPicker];
        self.xPicker.view.frame     = self.view.bounds;
        [self presentModalViewController:self.xPicker animated:YES];
    }
}

在模态视图控制器中,我做了一些事情,然后发出通知让父控制器知道可以解雇它。这部分感觉不对,但是当我进行模态视图调用时偶尔会出现错误:

[self.parentViewController dismissModalViewControllerAnimated:YES];

无论如何,我解雇模态视图的代码块如下:

- (void) reloadCell
{
    [self dismissModalViewControllerAnimated:YES];
    if (self.xPicker.choice != nil)
    {
        NSDictionary *choice        = self.xPicker.choice;
        NSMutableDictionary *row    = [[[[self.productDetails valueForKey:@"sections"] objectAtIndex:[[choice valueForKey:@"section"] intValue]] valueForKey:@"rows"] objectAtIndex:[[choice valueForKey:@"row"] intValue]];
        [row setObject:[choice valueForKey:@"value"] forKey:@"value"];
        [[self.productDetails valueForKey:@"post"] setObject:[choice valueForKey:@"value"] forKey:[row valueForKey:@"key"]];
        Request *xReq               = [[[Request alloc] init] autorelease];
        [NSThread detachNewThreadSelector:@selector(updateOrderFromProductDetails:) toTarget:xReq withObject:[self.productDetails valueForKey:@"post"]];
        self.xPicker                = nil;
    }
}

我不知道它是否相关,但我发现有趣的是,当我在设备处于横向模式时呈现此模态控制器时,视图变得不稳定。

有谁知道如何解决这个问题?

编辑 经过一些搜索,似乎两个问题都是相关的,并且与我当前的视图控制器是另一个视图控制器的子视图有关,但不是通过导航控制器。

据我了解,我决定不使用导航控制器会让我的视图堆栈混乱。我有一种感觉会回来咬我的屁股。

不幸的是,我无法在任何地方找到解决问题的方法。

3 个答案:

答案 0 :(得分:0)

如果你有一个与视图相关联的笔尖 - 进入每个视图的笔尖,并在每个笔尖的主视图中设置以下属性:

状态栏:未指定

顶栏:未指定

底栏:未指定

然后在大小: X:0,Y:0,W:320,H480

在分配每个视图后返回代码中,还在每个视图上将'wantsFullScreenLayout'属性设置为TRUE。

编辑:解释(?可能?: - ))

如果您在笔尖中指定了状态栏,那么uikit会自动调整您的视图以适应状态栏(并且您将看到您的视图yorigin为0且笔尖中的高度为460)但是如果你看起来在viewDidAppear方法的框架中的偏移/高度处,它已设置为20/460以满足状态栏的要求。

出于某种原因呈现模态视图控制器似乎搞乱这个并再次调整状态栏,将视图向下移动另外20.将状态栏设置为未指定并设置wantFullScreen布局停止uikit弄乱你的框架并让你控制(因此在笔尖尺寸中将高度设置为480)。

您还需要将所有视图元素向下移动20以满足480高度视图中的状态栏高度。

答案 1 :(得分:0)

好的,我有一个解决这个问题的方法。

我没有让我当前的视图控制器调用presentModalViewController,而是从appDelegate tabBarController调用它,如下所示:

[[(myAppDelegate *)[[UIApplication sharedApplication] delegate] tabBarController] presentModalViewController:self.myModalViewController animated:YES];

这仍然感觉有点hacky,但它解决了

的两个问题

1)在取消模态视图时调整大小

2)模态视图无法以横向模式弹出

我希望在这个残酷的苹果世界中,这可以帮助其他人。

答案 2 :(得分:-1)

当您的主视图返回时,请尝试添加:

[myTableView setFrame:CGRectMake(0,0,320,411)];