내용이 화면에 맞을 때 UITableView 테이블에서 스크롤을 비활성화하는 방법


240

내 iPhone 앱에 몇 (그룹화 된 스타일) 테이블이 있습니다 (화면의 일부에만 있고 Interface Builder하위 클래스로 분류되지 는 않지만 추가됨 UITableViewController). 시간의 80 %가 작고 화면에 맞습니다. 테이블이 화면에 맞으면 스크롤을 비활성화하여 좀 더 깨끗하게 만들고 싶습니다. 그러나 테이블이 화면에서 사라지면 (나중에 행을 추가 할 때) 스크롤을 다시 활성화하고 싶습니다 (그렇지 않으면 해당 내용을 볼 수 없기 때문에).

이 방법이 있습니까? 나는 그것을 알아낼 수없는 것 같습니다. 나는 알고있다 :

tableView.scrollEnabled = NO;

그러나 테이블 객체 크기 또는 이것을 계산하기 위해 무언가를 계산 해야하는지 또는 어디에 있는지 잘 모르겠습니다.


업데이트 : 마침내 나를 위해 일한 솔루션은 다음과 같습니다.

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

전화 한 후이 코드를 실행합니다. reloadData테이블 하면 올바른 크기를 계산하고 작동하는 것처럼 보입니다.

table.frame.size.heightInterface Builder화면에 표시된 객체의 실제 크기 (에서 볼 수 있음 )이고 table.contentSize.height높이는 머리글, 바닥 글 및 함께 추가 된 모든 셀의 높이입니다.


1
감사. 그 해결책은 저에게 효과적이었습니다. 그러나 UITableView를 확장하고 reloadData를 재정 의하여 scrollEnabled를 비활성화했습니다. 이유는 뷰 컨트롤러가 생성 될 때 테이블 뷰가로드되기 때문입니다. 그렇게하면 reloadData를 두 번 호출 할 필요가 없습니다.
Brandon O'Rourke

@JoeBlow OP의 요점을 놓친 것 같습니다. 문제는 바운스를 비활성화하는 방법이 아니라 테이블 뷰를 스크롤해야 할 때 스크롤을 활성화하는 방법입니다.
Kyle Clegg

아마도 테이블을 약간 회전하면 frame.height가 변경 될 것이라고 생각하기 때문에 경계를 사용하는 것이 좋습니다.
Ricardo

if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

답변:


396

당신이 설정하고 싶어

tableView.alwaysBounceVertical = NO;

6
자동 레이아웃을 사용하는 경우 contentSize <프레임보다 효과적입니다. 대답을 받아 들여야합니다.
Joshua Dance

1
나는 자동 레이아웃을 사용하고 있으며이 대답은 정확히 내가 필요로하는 것입니다.
Golden Thumb

3
스크롤을 비활성화하는 것보다 낫습니다
Kirit Vaghela

5
매력처럼 작동 interface builder하며 바운스를 해제하고 가로 / 세로로 바운스하여 비활성화 할 수도 있습니다 .
Ahsan Ebrahim


44

이 기능을 사용하여 보이는 셀 수를 확인할 수 있습니다.

- (NSArray *)visibleCells

이 메소드는 표시되는 셀이있는 배열을 리턴하므로이 배열의 오브젝트 수를 세고 테이블의 오브젝트 수와 비교할 수 있습니다. 동일한 경우. 스크롤을 사용 불가능하게 할 수 있습니다.

tableView.scrollEnabled = NO;

@Ginny가 언급했듯이 부분적으로 보이는 셀에 문제가있을 수 있으므로이 경우이 솔루션이 더 잘 작동합니다.

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

autoLayout을 사용하는 경우이 솔루션이 다음 작업을 수행하십시오.

tableView.alwaysBounceVertical = NO.

감사합니다! 이것은 주로 나를 위해 일하고 있습니다. 내가 지금 가지고있는 문제는 셀이 부분적으로 표시 될 때 여전히 표시되는 것으로 계산되므로 스크롤을 사용하도록 설정하면 스크롤이 비활성화됩니다.
지니

6
알아 냈습니다! 부분적으로 보이는 셀 문제로 인해 visibleCells를 전혀 사용할 수는 없지만 다음과 같이 작동합니다. if (table.contentSize.height < table.frame.size.height)>> 원본 게시물의 편집 참조.
Ginny


14

따라서 여러 답변이 있으며 한 번에 모든 내용이 필요 하므로이 답변을 추가합니다.

자동 레이아웃을 사용하는 경우이를 설정하면 다음과 같이 작동합니다.

  • 코드에서 :

tableView.alwaysBounceVertical = false

  • 또는 인터페이스 빌더에서 :

이 옵션과 untick" Bounce Vertically"옵션을 찾으십시오 .

참조는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

자동 레이아웃을 사용하지 않는 경우 :

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }

13

이 시도

[yourTableView setBounces:NO];

@kyle-메모 주셔서 감사합니다! 하지만 자동으로 일어나는 일을보십시오. 화면 (또는 다른 홀더)보다 짧으면 스크롤되지 않습니다 (반드시 튀지 않으며 스크롤되지 않습니다). 화면보다 길면 스크롤되고 실제로 바운스됩니다. 아니??
Fattie

어쩌면 나는 컬렉션 뷰를 너무 많이 사용했을 것입니다 ... 어쩌면 컬렉션 뷰에 대해 설명하지만 UITableView에 대해서는 설명하지 않습니다.
Fattie

9

스크롤보기 영역에서 표보기를 선택 / 선택 해제하여 바운스 활성화 / 비활성화 또는 스크롤을 설정할 수 있습니다.

스크롤 뷰 편집 영역


3

스토리 보드에서이를 편집 할 수 있습니다 (사용중인 경우). 테이블보기 아래에 "Scrolling Enabled"라는 확인란이 있습니다. 선택을 취소하면 완료됩니다.


3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;


3
귀하의 솔루션을 읽은 후 깨달았습니다. 많은 감사
Arash

나는 이것을 내 viewDidAppear에서 사용했다
Maria

1
viewDidLayoutSubviews viewDidAppear
Maria

0

내가 믿는 테이블 뷰 셀의 기본 높이는 44.0f입니다. 데이터 소스를 어레이에 보관해야합니까? 그런 다음 [array count]*44.0f프레임 경계를 넘어서 있는지 확인 하고 tableview.scrollEnabled = NO설정되어 있으면 YES로 설정하십시오. 특정 테이블 뷰에 대한 데이터 소스를 파악하는 위치에서 수행하십시오.


내 테이블 셀은 크기가 다르며 언제든지 크기가 변경 될 수 있습니다. 나는 heightForRowAtIndexPath 메서드를 사용하고 있으므로 44.0f를 하드 코딩하고 싶지 않을 것입니다. 그 숫자는 어쨌든 tableView.rowHeight와 동일하다고 생각합니까?
지니

그런 다음 해당 방법으로 총 높이 계산을 수행합니다. 간단 하죠? 화면 경계를 초과하면 스크롤을 활성화하고 그렇지 않으면 스크롤을 비활성화하십시오. 보이는 모든 셀에 대해 메소드가 호출됩니다. 화면을 초과 할만큼 데이터가 충분하지 않은 경우 해당 방법으로 전체 높이를 계산할 수 있습니다. 각 호출에서 반환되는 높이를 전역 변수에 계속 추가하면 총 높이가됩니다.
Bourne

Roberto의 대답은이 모든 것을 달성하고 계산을 테이블 뷰로 남기는 쉬운 방법입니다.
Bourne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.