IT Share you

Tableview 셀이 표시되는지 확인

shareyou 2021. 1. 9. 10:53
반응형

Tableview 셀이 표시되는지 확인


현재 tableview 셀이 표시되는지 알 수있는 방법이 있습니까? 첫 번째 셀 (0)이 uisearchbar 인 tableview가 있습니다. 검색이 활성화되지 않은 경우 오프셋을 통해 셀 0을 숨 깁니다. 테이블에 몇 개의 행만있는 경우 행 0이 표시됩니다. 행 0이 표시되는지 또는 맨 위 행인지 확인하는 방법은 무엇입니까?


UITableView호출 인스턴스 메소드 갖는다 indexPathsForVisibleRows반환 NSArrayNSIndexPath현재 표시되는 테이블의 각 행에 대해 개체. 필요한 빈도로이 방법을 확인하고 적절한 행을 확인할 수 있습니다. 예를 tableView들어가 테이블에 대한 참조 인 경우 다음 방법은 행 0이 화면에 있는지 여부를 알려줍니다.

-(BOOL)isRowZeroVisible {
  NSArray *indexes = [tableView indexPathsForVisibleRows];
  for (NSIndexPath *index in indexes) {
    if (index.row == 0) {
      return YES;
    }
  }

  return NO;
}

UITableView메서드가를 반환 하기 때문에 NSIndexPath섹션 또는 행 / 섹션 조합을 찾기 위해이를 쉽게 확장 할 수 있습니다.

이것은 visibleCells테이블 셀 객체의 배열을 반환하는 메서드 보다 더 유용 합니다. 테이블 셀 개체는 재활용되므로 큰 테이블에서는 궁극적으로 데이터 소스와의 단순한 상관 관계가 없습니다.


tableview 셀이 표시되는지 확인하려면이 코드를 사용하지 마십시오.

    if(![tableView.indexPathsForVisibleRows containsObject:newIndexPath])
    {
       // your code 
    }

여기서 newIndexPath는 셀 검사의 IndexPath입니다 .....

스위프트 3.0

if !(tableView.indexPathsForVisibleRows?.contains(newIndexPath)) {
  // Your code here

}

나는 이것을 Swift 3.0에서 사용합니다.

extension UITableView {

    /// Check if cell at the specific section and row is visible
    /// - Parameters:
    /// - section: an Int reprenseting a UITableView section
    /// - row: and Int representing a UITableView row
    /// - Returns: True if cell at section and row is visible, False otherwise
    func isCellVisible(section:Int, row: Int) -> Bool {
        guard let indexes = self.indexPathsForVisibleRows else {
            return false
        }
        return indexes.contains {$0.section == section && $0.row == row }
    }  }

Swift 버전 :

if let indices = tableView.indexPathsForVisibleRows {
    for index in indices {
        if index.row == 0 {
            return true
        }
    }
}
return false

또 다른 솔루션 (행이 완전히 보이는지 확인하는 데 사용할 수도 있음) row은의 프레임 tableview.

다음 코드에서 다음을 ip나타냅니다 NSIndexPath.

CGRect cellFrame = [tableView rectForRowAtIndexPath:ip];
if (cellFrame.origin.y<tableView.contentOffset.y) { // the row is above visible rect
  [tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
else if(cellFrame.origin.y+cellFrame.size.height>tableView.contentOffset.y+tableView.frame.size.height-tableView.contentInset.top-tableView.contentInset.bottom){ // the row is below visible rect
  [tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionBottom animated:NO];
}

Also using cellForRowAtIndexPath: should work, since it returns a nil object if the row is not visible:

if([tableView cellForRowAtIndexPath:ip]==nil){
  // row is not visible
}

IOS 4:

NSArray *cellsVisible = [tableView indexPathsForVisibleRows];
NSUInteger idx = NSNotFound;
idx = [cellsVisible indexOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)
{
    return ([(NSIndexPath *)obj compare:indexPath] == NSOrderedSame);
}];

if (idx == NSNotFound)
{

Note that "Somewhat visible" is "visible". Also, in viewWillAppear, you might get false positives from indexPathsForVisibleRows as layout is in progress, and if you're looking at the last row, even calling layoutIfNeeded() won't help you for tables. You'll want to check things in/after viewDidAppear.

This swift 3.1 code will disable scroll if the last row is fully visible. Call it in/after viewDidAppear.

    let numRows = tableView.numberOfRows(inSection: 0) // this can't be in viewWillAppear because the table's frame isn't set to proper height even after layoutIfNeeded()
    let lastRowRect = tableView.rectForRow(at: IndexPath.init(row: numRows-1, section: 0))
    if lastRowRect.origin.y + lastRowRect.size.height > tableView.frame.size.height {
        tableView.isScrollEnabled = true
    } else {
        tableView.isScrollEnabled = false
    }

ReferenceURL : https://stackoverflow.com/questions/3326658/determine-if-a-tableview-cell-is-visible

반응형