0

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];
    ...
4

1 に答える 1

1

それは奇妙なバグです。それがiCarouselの問題なのか、それともビュー階層からUITextViewを動的に追加および削除するときに対処する必要のあるiOSの癖なのかはわかりません。

私はあなたが見つけたものよりも多分少しきれいな解決策を持っています。これをMICardViewに追加するだけです。

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

これにより、基本的に、cardViewがリサイクルされるたびにtextViewが再レイアウトされ、問題を回避するためにViewControllerで特別なことを行う必要がなくなります。

于 2012-10-26T09:16:35.060 に答える