点击单元格时UIView位于UITableView之上?

时间:2014-04-11 17:16:42

标签: ios uitableview

我想要做的是在点击UITableViewCell时在smaller view上显示UITableView。我不想转换到另一个UIViewController,而是“popup”UITableView顶部的视图,它将包含有关单击UITableViewCell的更多信息。

我不认为我在寻找UIAlertView,但我正在寻找一个可以放置标签,按钮,图片等的UIView。

我希望我的术语是正确的。我还是个新手:)

莱昂

P.S。我所有的搜索都提出了UIAlertView的东西。

3 个答案:

答案 0 :(得分:1)

尝试使用UITableView的didSelectRowAtIndexPath委托功能,代码未经测试可以给你一个想法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Assuming view is at zero index of XIB file.
    // this view will contain all lable and other controls
    UIView *customView = (UIView *)[[NSBundle mainBundle] loadNibNamed:@"NameOfCustomViewXIBFile" owner:nil options:nil] objectAtIndex:0];

    customView.transform = CGAffineTransformMakeScale(0.0f, 0.0f);
    [self.view addSubView:customView];

    [UIView animateWithDuration:0.5
                     animations:
                  ^{
                          customView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
                       }
    ];   
}

希望它有所帮助!


修改

动画删除此弹出窗口:

    customView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);

    [UIView animateWithDuration:0.5
                     animations:
                  ^{
                          customView.transform = CGAffineTransformMakeScale(0.0f, 0.0f);
                       }
    ];   
    [customView removeFromSuperView];

答案 1 :(得分:0)

现有答案的问题在于,如果用户滚动表格以使单元格脱离屏幕并重新打开,则弹出的视图可能会因细胞重复使用而消失。为避免这种情况,您必须在单元格"模型"中存储一些内容。这样每次调用cellForRowAtIndexPath:时,如果它应该在那里,你用它的弹出视图重新生成单元格。只显示didSelectRowAtIndexPath:可能不够。

如果我编码它,我喜欢的方法是让所有单元格成为UITableViewCell的子类。该子类包含一个额外的BOOL showPopup。在你的setter setShowPopup中:你设置了值,还创建了&显示或破坏/删除/隐藏"弹出"该单元格的子视图。 (你可以让子视图成为一个总是在周围的类成员,在需要时分配和分配它,并保留一个引用,只需要显示/隐藏;这是一个尺寸/空间性能权衡。)

-(void) setShowPopup:(BOOL show) {
    showPopup = show;
    if(show) {
        // create subview, and add to view
    } else {
        // remove and destroy subview
    }
}

在UITableView委托/数据源中:

-(UITableViewCell) UITableView:(UITableView *table) cellForRowAtIndexPath:(NSIndexPath *ip) {
    // usual stuff to get a reusable cell or allocate a new one, and prepare it for display
    // then
    if(showPopup) {
       // create subview and add to view
    }   else {
       // remove and destroy subview
    }
}

答案 2 :(得分:0)

我在GLKViewController中使用了类似的UIButton,因此这可能适用于UITableViewController。我只是禁用了按钮并添加了一个圆形边框,所以它看起来像一个自定义弹出窗口。当用户点击一些有趣的东西时,我更改了按钮上的隐藏标志以显示或隐藏它。

这样的东西使它看起来像弹出式

在viewDidLoad中:

// make info "popup"
_infoBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_infoBtn.bounds = CGRectMake( 0, 0, kRightButtonBarDim, kRightButtonBarDim);
_infoBtn.backgroundColor = [UIColor colorWithWhite:1 alpha:0.75];
_infoBtn.selected = NO;
_infoBtn.titleLabel.font = [UIFont boldSystemFontOfSize:kTableCellFontSize];
_infoBtn.titleLabel.lineBreakMode = NSLineBreakByCharWrapping;
[_infoBtn setTitleColor:[UIColor colorWithWhite:.3 alpha:1] forState:UIControlStateDisabled];

// border
_infoBtn.layer.cornerRadius = 5;                             // rounded corners

// drop shadow
_infoBtn.layer.masksToBounds = NO;
_infoBtn.layer.shadowColor = [UIColor blackColor].CGColor;
_infoBtn.layer.shadowOpacity = 0.8;
_infoBtn.layer.shadowRadius = 12;
_infoBtn.layer.shadowOffset = CGSizeMake(12.0f, 12.0f);

_infoBtn.enabled = NO;
_infoBtn.hidden = YES;

[self.view addSubview:_infoBtn];

然后在tableView的didSelectRowAtIndexPath中更新按钮中所需的任何信息,并将hidden设置为NO。您应该能够向此UIButton添加任何必要的子视图。

_infoBtn.frame = CGRectMake(20, 20, 20, 20);    // set this wherever you like
[_infoBtn setTitle:@"text" forState:UIControlStateDisabled];
_infoBtn.hidden = NO;

我刚刚测试了一个UIViewController,它有一个UITableView作为子视图,它看起来一样。滚动并没有影响它(即,按钮没有随着滚动移动,几乎像HUD一样)因为按钮被添加到顶级UIView。 Dunno如果这是你需要的,但希望它会给你一些想法。