グループ化されたスタイルでUITableViewのセルの幅を設定する方法


107

私は約2日間これに取り組んでいるので、私はあなたと私の学んだことを共有すると思いました。

問題は、グループ化されたUITableViewのセルの幅を小さくすることは可能ですか?

答えはいいえだ。

しかし、この問題を回避するには2つの方法があります。

解決策1:テーブルを薄く するtableViewのフレームを変更して、テーブルを小さくすることができます。これにより、UITableViewは幅を縮小してセルを内部にレンダリングします。

この解決策は次のようになります。

-(void)viewWillAppear:(BOOL)animated
{
    CGFloat tableBorderLeft = 20;
    CGFloat tableBorderRight = 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
    tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
    tableView.frame = tableRect;
}

解決策2:セルを画像でレンダリングする

このソリューションについては、こちらをご覧ください:http : //cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

この情報がお役に立てば幸いです。たくさんの可能性を試すのに約2日かかりました。これが残ったものです。


3
これは2行目のみの質問(「質問は:...」)として設定する必要があると思います。その後、ソリューション#1とソリューション#2が2つの別々の回答として投稿され、そのうちの1つが受け入れられます。次に、他のユーザーが自分の回答を追加し、そのうちの1人がより良い結果を出した場合、受け入れられた回答を後で変更できます。
GeneralMike 2013

回答:


226

これを実現するより良い、よりクリーンな方法は、UITableViewCellをサブクラス化し、次の-setFrame:ようにそのメソッドをオーバーライドすることです。

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

なぜそれが良いのですか?他の2つは悪いので。

  1. テーブルビューの幅を調整 -viewWillAppear:

    まず、これは信頼性が低く、スーパービューまたは親ビューのコントローラー-viewWillAppear:は、呼び出された後、テーブルビューフレームをさらに調整する場合があります。もちろん、-setFrame:UITableViewCellsの場合と同じように、UITableViewをサブクラス化してオーバーライドできます。ただし、UITableViewCellsをサブクラス化することは、非常に一般的で軽く、アップルの方法です。

    次に、UITableViewにbackgroundViewがある場合、backgroundViewを一緒に絞り込まないようにします。UITableViewの幅を狭くしながらbackgroundViewの幅を維持することは簡単な作業ではありません。言うまでもなく、サブビューをスーパービューを超えて拡張することは、そもそもエレガントなことではありません。

  2. 狭い幅を偽るカスタムセルレンダリング

    これを行うには、水平マージンを持つ特別な背景画像を準備し、マージンに対応するようにセルのサブビューを自分でレイアウトする必要があります。比較すると、セル全体の幅を調整するだけの場合、自動サイズ変更ですべての作業が行われます。


2
これは素晴らしくてエレガントな解決策です、私はカテゴリでそれをしました:)また、透明なオブジェクトが多いほど、CPU負荷が高くなることにも気づきます:)
ミスター・コズ

11
@misterkoz-注意:一部のiOSコントロール(明確にはUIDatePicker)は内部的にUITableViewCellsを使用し、これをカテゴリに実装すると中断します。
Clafou

7
編集モードでセルを削除しようとすると、このメソッドはiOS8では機能しないようです。setFrameは、編集モードの開始/終了時に呼び出されるため、セルは縮小され続けます。これに対する解決策はありますか?
John Baum 14

3
@JohnBaumこのかもしれないのヘルプ(少なくとも私の場合はそれが動作する):stackoverflow.com/questions/25911484/ios-8-cell-resizing/...
HashtagMarkus

2
このソリューションは本当に天の恵みです。場合、誰かが迅速で同じことを行う方法を疑問に思っている- reddit.com/r/swift/comments/2fr849/...
SYSUSER

16

変数を設定するメソッドを提供しないSwiftでこれを行うには、のセッターをオーバーライドする必要がありますframe。もともと(少なくとも私が見つけたところ)ここに投稿されまし

override var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        let inset: CGFloat = 15
        var frame = newFrame
        frame.origin.x += inset
        frame.size.width -= 2 * inset
        super.frame = frame
    }
}

迅速な対応
Simon McNeil

9

何もうまくいかない場合は、これを試すことができます

セルの背景色をクリアカラーにし、必要なサイズのセルの画像を配置します。そのセルにテキストを表示したい場合は、画像の上にラベルを付けます。ラベルの背景色もクリア色に設定することを忘れないでください。


8

承認されたソリューションがローテーションで機能しないことがわかりました。固定幅と柔軟なマージンでUITableViewCellsを実現するために、上記のソリューションを次のように適応させました。

- (void)setFrame:(CGRect)frame {

    if (self.superview) {
        float cellWidth = 500.0;
        frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2;
        frame.size.width = cellWidth;
    }

    [super setFrame:frame];
}

このメソッドはデバイスが回転するたびに呼び出されるため、セルは常に中央に配置されます。


0

画面が回転したときに呼び出されるメソッドがあります:viewWillTransitionToSize

ここでフレームのサイズを変更する必要があります。例を参照してください。必要に応じてフレームの座標を変更します。

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        int x = 0;
        int y = 0;
        self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height);
    }];
}

-2

私はそれをします

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    CGFloat tableBorderLeft = self.view.frame.origin.x + 10;
    CGFloat tableBorderRight = self.view.frame.size.width - 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x = tableBorderLeft; 
    tableRect.size.width = tableBorderRight; 
    tableView.frame = tableRect;
}

そしてこれは私のために働きました


-6

.hファイルにデリゲート 'UITableViewDataSource'を追加します

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    return size;
}

4
彼は高さではなく幅を設定したいと思っています
Christopher Pickslay

おおおお。ご不便をおかけします。
bharath gangupalli 2010

質問と誤解を理解し、高さを答えてください。幅ではなく高さを検索しているので、私にとって何が効果的か知っています。答えをありがとう
Pooja
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.