web-dev-qa-db-ja.com

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

私はこれに約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日かかりました。これが残ったものです。

107
Tomen

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

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

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

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

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

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

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

    これを行うには、水平方向の余白を持つ特別な背景画像を準備し、余白に対応するためにセルのサブビューを自分でレイアウトする必要があります。これに対して、セル全体の幅を調整するだけで、自動サイズ変更がすべての作業を行います。

225
an0

変数を設定するメソッドを提供しない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
    }
}
13
JuJoDi

何も機能しない場合は、これを試すことができます

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

9
includeMe

受け入れられた解決策は、ローテーションでは機能しないことがわかりました。固定幅と柔軟なマージンで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];
}

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

8
Graham

画面が回転したときに呼び出されるメソッドがあります: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);
    }];
}
0
Guy