2012-02-09 5 views
13

내 ScrollView에 몇 가지 하위 뷰 (이미지/버튼)를 추가하는 방법이 있습니다.UIScrollView를 새로 고침/다시로드하는 가장 좋은 방법

ScrollView 외부에서 사용자는 ScrollView의 내용을 변경할 수있는 버튼을 누를 수 있습니다.

있는 ScrollView를 더 이상 "다시"어떤 괜찮은 방법이 있나요 :이 솔루션은 불필요한 뷰를 제거시에있는 ScrollView

답변

19

setNeedsDisplay을 호출하면 스크롤보기가 다시 그려지며 실제로는 내용이 제거되지 않습니다.

발견 한대로 모든 스크롤보기 하위보기에서 removeFromSuperview을 호출하면 스크롤 막대가 제거되는 경우가 있습니다 (좋지 않음).

이 문제를 해결하는 방법은 두 가지가 있습니다. 첫 번째 방법은 스크롤보기에 추가 한 모든보기가 포함 된 고유 한 배열을 유지하는 것입니다. 대신이 배열을 반복 할 수 있습니다. 내 생각에 이것은 아마도 최선의 접근 방법입니다.

for (UIView *view in self.contentView.subviews) 
{ 
    if (![view isKindOfClass:[UIImageView class]]) 
     [view removeFromSuperview]; 
} 

를 스크롤 막대가 스스로이 제거되지 않습니다 UIImageView 서브 클래스이기 때문에 :

다른, 약간 해키, 방법은 당신이 그들을 반복으로 의견을 테스트하는 것입니다. 그러나 이미지 뷰를 직접 사용하는 경우 이미지 뷰를 유지할 수 없으며 향후 iOS 버전에서는 이미지 뷰를 유지할 수 있다고 보장 할 수 없습니다.

첫 번째 접근법을 사용하고 추가 한 모든 뷰를 배열에 유지하는 것이 훨씬 좋습니다.

+0

확실히 좋은 생각입니다. 이전에는 생각한 적이 없었습니다 ... 동일한 문제가있는 다른 사람들에게 명확하게 알리기 : 하위보기를 scrollView에 추가 할 때 배열에도 추가하십시오. 제거가 필요하면 배열을 반복하고 removeFromSuperview로 메시지를 보내십시오. –

0

에 위치를 표시하기 위해 줄을 제거

for (UIView * view in myScrollView.subViews) { 
    [view removeFromSuperview]; 
} 

하는 것으로 (이 난 당신이 주위에 해결할 수 없을거야) 다음 그림주기에 UIScrollView 새로 고치려면 [myScrollView setNeedsDisplay]; 호출하십시오.

+0

및 호출하여있는 UIScrollView의 콘텐츠 크기를 업데이트하는 것을 잊지 마세요'[myScrollView setContentSize : 크기]'호출하기 전에'[myScrollView setNeedsDisplay]'나'[myScrollView setNeedsLayout]' –

+2

이 참조 그래서 그것은 단순한 방법으로'[[myScrollView subviews] makeObjectsPerformSelector : @selector (removeFromSuperview); '를 사용하는 것이 좋습니다 어디에서 질문 : http://stackoverflow.com/questions/2156015/iphone-remove-all-subviews 모든 하위 뷰를 제거합니다. –

+0

* 방금 "이 솔루션은 ScrollView에서 위치를 나타내는 막대를 제거합니다"* ... UIView 내부에 UIScrollView를 놓고 단순히 UIScrollView를 제거하고 새 UIScrollView를 만들고 다시 채우는 것이 아니라는 것을 알았습니다 그것? (어쨌든 모든 하위 뷰를 제거 할 계획이라면) –

2

나는 일반적으로 scrollview에 넣은 뷰의 분리 가능한 배열을 유지하고 subviews 대신 반복 할 수 있습니다. 그런 식으로 제가 넣은 것만 빼내겠습니다. 그러나 기본적인 접근 방식은 동일합니다.

3

이 오래된 스레드의 종류이지만, 약간 쉬운 방법은 단지에 태그를 추가 할 수 있습니다보기의 당신의있는 UIScrollView에 추가, 그리고

for (UIView * view in _scrollView.subviews) { 
    if (view.tag == 15) { 
     [view removeFromSuperview]; 
    } 
} 

이 방법으로 당신이 할 수의이 (15)를 가정 해 봅시다 추가 한 뷰만 제거되도록하십시오. 그냥 생각.

1

여기 내가 스크롤바를 제외한 모든 하위보기를 제거한 이유는 frame.size.width가 10보다 크고 스크롤바 너비가 10보다 작은 모든 하위보기를 제거했기 때문에 제거되지 않습니다. 이것은 당신이 UIScollView에 추가 모든 뷰는 폭이 있다고 가정보다 10

for (UIView * view in view.subviews) { 
    if(view.frame.size.width > 10){ // removes all component except scrollbar 
     [view removeFromSuperview]; 
    } 
} 
0

당신은 단순히있는 ScrollView에서 모든 데이터를 제거의 시작 스크롤 방법 전에이 라인을 설정해야하고 방법에있는 ScrollView에 따라 것입니다 다시 놓기.

 NSArray* subviews = [[NSArray alloc] initWithArray: Main_Scroll.subviews]; 
     for (UIView* view in subviews) 
     { 
      if ([view isKindOfClass:[UIView class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UIImageView class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UIButton class]]) 
      { 
       [view removeFromSuperview]; 
      } 
      if ([view isKindOfClass:[UILabel class]]) 
      { 
       [view removeFromSuperview]; 
      } 
     }