2012-10-23 4 views
0

iCarousel을 사용하여 편집 가능한 질문 카드를 표시하고 있습니다. 카드에는 질문을 입력하기위한 UITextView가 있습니다 (또는 채워진 카드를 스 와이프 할 때 이미 텍스트가 포함되어 있음). 그러나 캐 러셀이 제시되고 스크롤 될 때 텍스트보기가 비어있는 것처럼 보일 수 있습니다.iCarousel 및 UITextView - 빈 텍스트보기

이것은 화면에 텍스트를 그리지 않는 UITextView 최적화 때문입니다. 그러나 UITableView의 텍스트 뷰는이 점을 겪지 않을 것이다.

많은 사람들이 알고 있듯이 setNeedsDisplay를 사용하면 최적화로 인해 작동하지 않으므로 텍스트를 다시 그려 내지 않습니다.

현재 1px를 추가 한 다음 제거하여 텍스트보기의 프레임을 변경합니다. 이렇게하면 강제로 다시 그리기가 수행됩니다. 그러나 항목을 변경하는 경우에만이 작업을 수행 할 수 있습니다. iCarousel에는 willDisplayCell 대리자 메소드가 없습니다. (닉, 당신은 쉽게 하나를 추가 할 수 있습니까?이 코드는 나에게 배플)

을 iCarousel 많은 부드러움에 대한 전망을 사전로드되어 있기 때문에 (필요 을 iCarouselOptionVisibleItems을 설정하면 아무것도가 해결되지 않음) 할 수없는 것 내가 할 수있는 다른 것은 있지만 화면이 언제 화면에 올지 알 수 있습니다. 제안?

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 
{ 
    MIQuestionView *questionView = (MIQuestionView *)view; 

    if (questionView == nil) 
    { 
     MIQuestionType type = [self.testSection.questionType integerValue]; 
     questionView = [[MIQuestionView alloc] initWithFrame:CGRectNull questionType:type]; 
     questionView.delegate = self; 
    } 

    questionView.question = [self.testSection.questions objectAtIndex:index]; 

    return questionView; 
} 

텍스트보기가 MIQuestionView에 포함되어 있습니다. 텍스트는 질문 설정자에서 설정됩니다. 화면에 언제 나타나는지 알 수있는 방법이 없습니다. 분명히하기 위해, 나는 크기를 바꾸고 싶지 않습니다. 텍스트는 화면 밖에서 그려지지 않으며 화면에 올 때 공백으로 표시됩니다.

죄송합니다, 나는 위의 모호한 코드를 보이지 않았다 :

- (id)initWithFrame:(CGRect)frame questionType:(MIQuestionType)type 
{ 
    if (CGRectEqualToRect(frame, CGRectNull)) 
     frame = CGRectMake(0, 0, 650, 244); 

    self = [super initWithFrame:frame]; 
    ... 
+0

viewForItemAtIndex 메서드에 붙여 넣을 수 있으므로 뷰 재활용에 아무런 문제가없는 것을 확인할 수 있습니까? 이전에 제대로 화면 크기를 조정하지 않은 텍스트 필드에 대해서는이 문제를 보지 못했습니다. –

+0

viewForItemAtIndex를 포함하도록 업데이트되었습니다. UITableView 구현과 인라인으로 생각한 꽤 명확한 구현. 문제의 크기가 조정되지 않았습니다. UITextView가 화면 밖에서 텍스트를 그리지 않습니다. –

+0

초기 프레임으로 CGRectNull을 사용하는 것과 관련된 문제 일 수 있습니까? CGRectZero (또는 실제 0이 아닌 rect)가 더 잘 작동 할 수 있습니다. –

답변

1

그것은 이상한 버그. iCarousel에 문제가 있는지 또는 iOS의 단점이라면 뷰 계층 구조에서 UITextViews를 동적으로 추가 및 제거 할 때 처리해야 할 것인지 확실하지 않습니다.

나는 당신이 발견 한 것보다 조금 더 깨끗한 해결책을 가지고 있습니다;

- (void)didMoveToSuperview 
{ 
    if (self.superview) 
    { 
     _textView.frame = self.bounds; 
    } 
} 

이 기본적으로 cardView이 재생 될 때마다 레이아웃 다시하기 위해 텍스트 뷰를 강제로, 그것을 당신이 문제를 해결하기 위해 뷰 컨트롤러에 특별한 일을 할 필요 방지 : 그냥 MICardView이를 추가 할 수 있습니다.

+0

우아한 솔루션. 개인적으로보기를로드 할 때 CGRectZero에 텍스트보기를 설정하고 didMoveToSuperview에서 적절한 프레임 rect를 설정합니다. 같은 프레임을 설정해도 텍스트보기가 (UITextView 최적화의 일부로) 텍스트 레이아웃과 그리기를 수행하지 않기 때문에 이것을 선택했습니다. 고마워, 닉. –