9

因此,客户的规范希望 UITableView 始终存在其中一个行,因此用户可以在 UITableView 的任何位置与这个关键按钮进行交互。一旦他滚动并看到带有按钮的实际行,浮动页脚必须消失并允许用户与“真实”单元格进行交互,而不是浮动版本。

我想出了以下代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{    
    if([self isPostularmeRowVisible])
    {
        [self hidePostularmeFooterView];
    }
    else
    {
        [self showPostularmeFooterView];
    }
}

-(BOOL)isPostularmeRowVisible
{        
    NSArray *indexes = [self.tableView indexPathsForVisibleRows];
    for (NSIndexPath *index in indexes)
    {
        if (index.row == 0 && index.section>=DetalleEmpleoPostularmeCell)
        {
            return YES;
        }
    }
    return NO;
}

-(void) showPostularmeFooterView
{
    NSAssert(_state==ESTADO_POSTULACION_NO_POSTULADO, @"NJDetalleEmpleoViewController: This shouldn't happen");

    if(!self.footerView)
    {
        NJDetalleEmpleoPostularmeTableViewCell *footerView = [self.tableView dequeueReusableCellWithIdentifier:kDetalleEmpleoPostularmeCell];
        [footerView configureCell:self.detaleAviso];
        float h = self.view.frame.size.height-footerView.cellHeight;
        footerView.frame = CGRectMake(0,h,self.view.frame.size.width,footerView.cellHeight);
        footerView.delegate = self;
        self.footerView = footerView;
        [self.view addSubview:self.footerView];
        [self.view bringSubviewToFront:self.footerView];
    }
}

-(void) hidePostularmeFooterView
{
    if(self.footerView)
    {
        [self.footerView removeFromSuperview];
    }

    self.footerView = nil;
}

但是这段代码有一个我似乎无法弄清楚的错误:一旦用户点击 UITextBox 并输入一些文本,它就会开始表现不稳定,即:屏幕上出现 2 个或更多单元格,而应该没有!基本上,当我调用“hidePostularmeFooterView”方法时,它似乎并没有消失(只有在我输入了一些文本之后,如果我不与之交互,它就可以正常工作)。

在此处输入图像描述

在我输入一些文本后,似乎有 2 个版本的页脚,这是证据:

在此处输入图像描述

4

2 回答 2

5

将其删除为单元格和页脚并将其替换为它自己的UIView下方可能更有意义,UITableView并且UITableView仅将 的框架高度降低到此视图的 y 原点,而不是占据整个屏幕. 这样,您将能够随时查看视图并与之交互。你有什么理由需要这个UITableViewCell吗?

于 2017-07-21T19:30:22.980 回答
3

在此处输入图像描述

我不会触摸footerView,而是创建一个自定义视图,如下所示:

dataSource = [NSMutableArray new];
for (int n = 0; n < 100; n++){
    [dataSource addObject:[NSString stringWithFormat:@"%i",n]];
}

table = [UITableView new];
table.frame = self.view.bounds;
table.delegate = self;
table.dataSource = self;
[self.view addSubview:table];

popUpView = [UIImageView new];
popUpView.frame = CGRectMake(0, h-200, w, 200);
popUpView.image = [UIImage imageNamed:@"Grumpy-Cat.jpg"];
popUpView.contentMode = UIViewContentModeScaleAspectFill;
popUpView.clipsToBounds = true;
popUpView.layer.borderColor = [UIColor redColor].CGColor;
popUpView.layer.borderWidth = 2.0f;
[self.view addSubview:popUpView];

像往常一样设置 tableView,在 scrollViewDidScroll 方法中,你可以粘贴这样的东西:

NSIndexPath * specialRow = [NSIndexPath indexPathForRow:50 inSection:0];
NSArray * indices = table.indexPathsForVisibleRows;
if ([indices containsObject:specialRow]){
    if (isShowing){
        isShowing = false;
        [UIView animateWithDuration:1.0f
                              delay:0.0f
             usingSpringWithDamping:1.0f
              initialSpringVelocity:0.8f
                            options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
                         animations:^{
                             popUpView.transform = CGAffineTransformMakeTranslation(0, popUpView.frame.size.height + 10);
                         }
                         completion:^(BOOL finished){
                         }];
    }
} else if (!isShowing) {

    isShowing = true;
    [UIView animateWithDuration:1.0f
                          delay:0.0f
         usingSpringWithDamping:1.0f
          initialSpringVelocity:0.8f
                        options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         popUpView.transform = CGAffineTransformIdentity;
                     }
                     completion:^(BOOL finished){
                     }];
}

其中 isShowing 是一个跟踪 popUpView 状态的布尔值。这是快速而肮脏的代码,应该在别处声明 specialRow 等。在这种情况下,它被定义为 100 行中的第 50 行。

作为记录,我认为拥有这样的重复功能并不是一个好的设计,但是嘿,客户最清楚:D

于 2017-08-08T11:36:58.410 回答