2016-08-24 15 views
0

上の高さを更新しない自動リサイズ私は、カスタムtableViewCellを持っています。セルが最初のロード

このExtra textラベルは非表示に設定されています。ラベルの周りのルールについて:

-(void)setShowExtraText:(BOOL)showExtraText 
{ 
    _showExtraText = showExtraText; 
    if (showExtraText) { 

     self.textfieldBottomSuperviewConstraint.active = NO; 

     self.extraText.hidden = NO; 

     self.textfieldExtraTextConstraint.active = YES; 
     self.leadingExtraTextConstraint.active = YES; 
     self.extraTextBottomContraint.active = YES; 
    } 
    else{ 
     self.extraText.hidden = YES; 

     self.textfieldExtraTextConstraint.active = NO; 
     self.leadingExtraTextConstraint.active = NO; 
     self.textfieldBottomSuperviewConstraint.active = YES; 
     self.extraTextBottomContraint.active = NO; 
    } 
} 

を有する唯一つのセルが無い隠さExtra textラベルを持っており、これはのtableViewの最後の一つでもあります。

問題は、tableViewがセルの高さを読み込む際に問題があることです。また、それを見てDebug View Hierarchyは、ルールを非アクティブ化するコードを無視していることを示しています。非活性化されたルールはまだ表示されているためです。

スクロールして上にスクロールすると、セルのレイアウトが正しく表示され、余分なテキストがないものと正しく表示されないものが正しく表示されます。

私が追加してみました:

[self setNeedsLayout]; 
    [self layoutIfNeeded]; 

私はSizeClassesを使用してみました。 (私は前にsizeClassesを使用していませんでした)

私はアイデアが不足していますか?

おかげ


アップデート1

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithExtraText" forIndexPath:indexPath]; 

     [cell setShowExtraText:(indexPath.section == LOGIN_SECTION && indexPath.row == REPEAT_PASSWORD_ROW)]; 

     return cell; 
} 

での更新2

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithExtraText" forIndexPath:indexPath]; 

     [cell setShowExtraText:(indexPath.section == LOGIN_SECTION && indexPath.row == REPEAT_PASSWORD_ROW)]; 

     [cell updateConstraintsIfNeeded]; 

     [self.tableView beginUpdates]; 
     [self.tableView endUpdates]; 

     [self.tableView setNeedsLayout]; 
     [self.tableView layoutIfNeeded];  

     return cell; 
} 

答えて

1

CellForRowAtIndexPath

セルを返す前に、呼び出し

はあなたがすべてでCellForRowAtIndexPath方法を示していないあなたの例では

をupdateConstraintsIfNeeded。 を呼び出す前に、あなたのsetShowExtraTextを呼び出していることを確認しますが

とテーブルビューの呼び出しで updateConstraintsIfNeeded:その後

ReloadData

[self.tableView setNeedsLayout]; 
[self.tableView layoutIfNeeded]; 

した後に、すべての時間

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 
+0

を得る作られた私はCellForRowAtIndexPathにsetShowExtraText後updateConstraintsIfNeededを追加しましたが、それはまだ同じことをやっています。 私は[cell updateConstraintsIfNeeded]を行う必要があると思います。しかし、私は[tableView updateConstraintsIfNeeded]でも試してみました。どちらも働いていませんでした。ありがとう – xarly

+0

あなたは正しいです、私は自分のコードと私は "setNeedsLayout"と "layoutIfNeeded"私のtableViewで呼び出すすべてのリロードをチェックした。また、セルの高さの変更に関する "beginUpdates"と "endUpdates"。 (私は、AutoLayoutでresizingCellを使用しています) – MCMatan

+0

あなたが言ったように、アップデート2ではやってみましたが、まだ動作していません。ありがとう:) – xarly

0

自動レイアウトルールを有効または無効にするときに問題があると思います。

ルールやビューのいずれかの特性を変更しても問題はありません。私はちょうど

[self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

[self.tableView setNeedsLayout]; 
    [self.tableView layoutIfNeeded]; 

と、テーブル内の任意の更新を行う必要はありません

-(void)setShowExtraText:(BOOL)showExtraText 
{ 
    _showExtraText = showExtraText; 

    if (showExtraText) { 
     [self.extraText setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisVertical]; 
     [self.extraText setContentCompressionResistancePriority:750 forAxis:UILayoutConstraintAxisHorizontal]; 
    } 
    else{ 
     [self.extraText setContentCompressionResistancePriority:1 forAxis:UILayoutConstraintAxisVertical]; 
     [self.extraText setContentCompressionResistancePriority:1 forAxis:UILayoutConstraintAxisHorizontal]; 
    } 
} 

は、例えば、これは完全に機能するソリューションです働く

明らかに、これは階層内にExtra textというラベルを付けるのが嫌なので、これは回避策です。このソリューションでは、ラベルはまだそこにありますが、高さと幅は0です。

私はそれが誰かを助けてくれることを願っています。あなたのアイデアを

おかげ@MCMatanが、私は解決策:)

関連する問題