如何获取UITableView的可见部分?

时间:2010-11-16 04:49:59

标签: iphone ios objective-c uitableview

UITableView提供方法indexPathsForVisibleRowsvisibleCells,但如何获取可见部分?

11 个答案:

答案 0 :(得分:20)

或者真正简单的方法是利用valueForKeyPath和NSSet类:

NSSet *visibleSections = [NSSet setWithArray:[[self.tableView indexPathsForVisibleRows] valueForKey:@"section"]];

基本上,您会在可见行中获取一个节值数组,然后使用此方法填充一个集合以删除重复项。

答案 1 :(得分:8)

Swift版

if let visibleRows = tableView.indexPathsForVisibleRows {
    let visibleSections = visibleRows.map({$0.section})
}

答案 2 :(得分:7)

UITableViews使用NSIndexPath存储其单元格。因此,部分没有对象。使用下面的代码,我们可以遍历表并使用可见部分的索引执行操作(我不确定为什么你想要可见部分,因为可见仅表示它们当前在屏幕上,但无论如何)。

for (NSIndexPath* i in [yourTableViewName indexPathsForVisibleRows])
{
  NSUInteger sectionPath = [i indexAtPosition:0];
  //custom code here, will run multiple times per section for each visible row in the group
}

答案 3 :(得分:1)

我有解决方案。

第一步,每个部分将显示由- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section创建的UIView,它将存储到数组中。

当滚动TableView时,我想要释放不可见的剖面视图,所以我需要知道哪个部分是可见的,跟随功能代码将为此检测,如果视图可见则将其释放。

-(BOOL)isVisibleRect:(CGRect)rect containerView:(UIScrollView*)containerView
{
    CGPoint point = containerView.contentOffset;
    CGFloat zy = point.y ;

    CGFloat  py =  rect.origin.y + rect.size.height;
    if (py - zy <0) {
            return FALSE;
    }
    CGRect  screenRect = containerView.frame;

    CGFloat by = screenRect.size.height + zy ;
    if (rect.origin.y > by) {
            return FALSE;
    }
    return TRUE;
}

rectUIView部分的框架; containerViewUITableView

通过这种方式,我可以获得UITableView的可见部分,但我希望SDK可以直接为此目的提供API。

答案 4 :(得分:1)

获取UITableView中可见部分的2步解决方案:

1)将标题视图添加到viewForHeaderInSection中的可变数组中 2)当tableview在scrollViewDidScroll

中滚动时更新数组

请注意使用tag属性来保存节号

@property (nonatomic, strong, readwrite) NSMutableArray *headerArray;

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 40)];
    headerView.backgroundColor = [UIColor greenColor];
    headerView.tag = section;
    [_headerArray addObject:headerView];
    return headerView;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self updateHeaderArray];
    NSLog(@"------------");
    for (UIView *view in _headerArray) {
        NSLog(@"visible section:%d", view.tag);
    }
}

- (void)updateHeaderArray {
    // remove invisible section headers
    NSMutableArray *removeArray = [NSMutableArray array];
    CGRect containerRect = CGRectMake(_tableView.contentOffset.x, _tableView.contentOffset.y,
                                      _tableView.frame.size.width, _tableView.frame.size.height);
    for (UIView *header in _headerArray) {
        if (!CGRectIntersectsRect(header.frame, containerRect)) {
            [removeArray addObject:header];
        }
    }
    [_headerArray removeObjectsInArray:removeArray];
}

答案 5 :(得分:1)

使用kvc

更简单,更简洁
NSArray *visibleSections = [self.tableView.indexPathsForVisibleRows valueForKey:@"section"];

这可能会为您提供一个具有重复值的数组,但您可以从那里进行管理。

答案 6 :(得分:1)

for (NSUInteger section = 0; section < self.tableView.numberOfSections; ++section) {
    UIView *headerView = [self.tableView headerViewForSection:section];
    if (headerView.window) {
        NSLog(@"its visible");
    }
}

答案 7 :(得分:0)

另一个解决方案,在部分标题视图的标记中使用1位,就像那样

#define _TBL_TAG_SECTION(_TAG) ((_TAG)|(1<<30))
#define _TBL_TAG_CLEAR(_TAG) ((_TAG)&((1<<30)-1))
#define _TBL_TAG_IS_SECTION(_TAG) ((_TAG)>>30)

- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    // alloc header view
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
    header.tag = _TBL_TAG_SECTION(section);
    return header;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect r = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y,
                      CGRectGetWidth(scrollView.frame),
                      CGRectGetHeight(scrollView.frame));
    for (UIView *v in [_tableView subviews]) {
        if ( CGRectIntersectsRect(r, v.frame) ) {
            if ( _TBL_TAG_IS_SECTION(v.tag) ) {
                NSLog(@"visible section tag %d", _TBL_TAG_CLEAR(v.tag));
            }
        }
    }
}

答案 8 :(得分:0)

Swift 4.1

self.sections.indices.forEach{ (i:Int) in
    let section:UIView? = self.tableView(self, viewForHeaderInSection: i)
}

答案 9 :(得分:0)

您在Swift 4中尝试过吗?

# Define a vector which has different kernel methods
kerna <- c("rbfdot","polydot","vanilladot","tanhdot","laplacedot",
           "besseldot","anovadot","splinedot")

# Define a for loop to calculate accuracy for different values of C and kernel
for (ker in kerna){
    cValues <- c()
    accuracyValues <- c()
    for (c in 1:100) {
        model <- ksvm(V11~V1+V2+V3+V4+V5+V6+V7+V8+V9+V10,
                      data = credit_card_data,
                      type ="C-svc",
                      kernel = ker,
                      C=c,
                      scaled =TRUE)
        pred <- predict(model,credit_card_data[,1:10])
        #pred
        accuracy <- sum(pred== credit_card_data$V11)/nrow(credit_card_data)

        cValues[c] <- c;
        accuracyValues[c] <- accuracy;

    }

    for(i in 1:100) {
        print(paste("kernal:",ker, "c=",cValues[i],"accuracy=",accuracyValues[i]))


    }

}

答案 10 :(得分:0)

Swift 4和Swift 5

import call

call.call_name1('Kevin')

使用方法

extension UITableView {

    func returnVisibleCellsIndexes() -> [IndexPath] {
        var indexes = [IndexPath]()
        for cell in self.visibleCells {
            if let indexpath = self.returnIndexPath(cell: cell) {
                indexes.append(indexpath)
            }
        }
        return indexes
    }
    func returnIndexPath(cell: UITableViewCell) -> IndexPath?{
        guard let indexPath = self.indexPath(for: cell) else {
            return nil
        }
        return indexPath
    }
    
    func returnVisibleCells() -> [UITableViewCell]{
        let visiblecell = self.visibleCells
        return visiblecell
    }
    
}