私はこれに約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日かかりました。これが残ったものです。
これを実現するためのより良い、よりクリーンな方法は、UITableViewCellをサブクラス化し、その-setFrame:
メソッドを次のようにオーバーライドすることです:
- (void)setFrame:(CGRect)frame {
frame.Origin.x += inset;
frame.size.width -= 2 * inset;
[super setFrame:frame];
}
なぜそれが良いのですか?他の2つはもっと悪いからです。
-viewWillAppear:
でテーブルビューの幅を調整します
まず第一に、これは信頼性が低く、スーパービューまたは親ビューコントローラは、-viewWillAppear:
が呼び出された後にテーブルビューフレームをさらに調整する場合があります。もちろん、UITableViewCellsの場合と同様に、UITableViewの-setFrame:
をサブクラス化してオーバーライドできます。ただし、UITableViewCellsのサブクラス化は非常に一般的で、軽量で、Appleの方法です。
第二に、UITableViewにbackgroundViewがある場合、そのbackgroundViewが一緒に絞り込まれないようにします。 UIViewViewの幅を狭めながらbackgroundViewの幅を維持することは簡単な作業ではありません。スーパービューを超えてサブビューを展開することは、そもそも非常にエレガントなことではありません。
より狭い幅を偽装するカスタムセルレンダリング
これを行うには、水平方向の余白を持つ特別な背景画像を準備し、余白に対応するためにセルのサブビューを自分でレイアウトする必要があります。これに対して、セル全体の幅を調整するだけで、自動サイズ変更がすべての作業を行います。
変数を設定するメソッドを提供しない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
}
}
何も機能しない場合は、これを試すことができます
セルの背景色をクリアカラーにして、必要なサイズのセルの画像を配置します。そのセルにテキストを表示する場合は、画像の上にラベルを付けます。ラベルの背景色もクリアカラーに設定することを忘れないでください。
受け入れられた解決策は、ローテーションでは機能しないことがわかりました。固定幅と柔軟なマージンで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];
}
デバイスが回転するたびにメソッドが呼び出されるため、セルは常に中央に配置されます。
画面が回転したときに呼び出されるメソッドがあります: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);
}];
}