2017-05-17 6 views
0

私はカスタムセルをディスプレイの端から離して配置します。そのために私はこれを使用します:テーブルを更新するときにUITableViewCell setFrameが "駄目"になる

- (void)setFrame:(CGRect)frame { 
    frame.origin.x += kCellSidesInset; 
    frame.size.width -= 2 * kCellSidesInset; 
    [super setFrame:frame]; 
} 

私は、セル内の積み重ねられたビューの下のビューを隠す/表示するボタンを持っています。私はこのコードを使用している場合:

- (IBAction)showCardDetails:(id)sender { 
     UITableView *cellTableView = (UITableView*)[[[[sender superview] superview] superview] superview ]; 
     [cellTableView beginUpdates]; 
     self.details.hidden = !self.details.hidden; 
     [cellTableView endUpdates]; 
// [cellTableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationBottom]; 
// [cellTableView reloadData]; 
    } 

をしかし、テーブルは右パディングが大きく充てるなっ変更を反映するように更新されたとき。それから私が少しスクロールすると、それは修正されます。

私は視覚的にそれが3回のように判断できるほどです。たぶん右側に2つのkCellSidesInsetが追加されているかもしれませんが、私はそれを疑っています。

なぜこのようなことが起こり、どのように修正できますか?おそらくそれは、セルにインセットを渡す代わりに、UITableViewに与える(私はこれを行う方法を考える上でいくつかの問題があります)ことを避けることができます。

PS。すべてのコードはCustomCell.mの中にあります。私は、アクション内でUITableViewを取得するより良い方法を提案しています。セルを追加したときにアクションを実装するためにCustomTableViewController.mのセレクタを使用する必要がありますか?

EDIT:私が見ることができるところから、細胞の再レンダリングは3段階に分かれています。 フェーズ1、これらのカップル:

enter image description here

フェーズ2は、それがビューのセルを更新します。

enter image description here

そして、ここですべてが今のところよさそうです。私は非表示にしたいビュー/ショーが示さ/隠れて、すべてが良いですが、その後のクリーンアップのいくつかの並べ替えがレイアウトを壊し:

enter image description here

+1

setFrameの代わりにautolayoutを使用することに問題はありますか? –

+0

@elk_cloner autolayoutでセルにインセットを追加する方法がわかりません – h3dkandi

答えて

0

私はスーパーのフレームを使用するようにsetFrameメソッドをリファクタリングすることで問題を解決しましたセルの基準点としてのセルの範囲

- (void)setFrame:(CGRect)frame { 
    frame.origin.x = self.superview.frame.origin.x + kCellSidesInset; 
    frame.size.width = self.superview.frame.size.width - 2 * kCellSidesInset; 

    [super setFrame:frame]; 
} 
関連する問題