回答:
これは、Xcode 6.4およびSwift 1.2を使用するiOS 8.4〜9.0デバイスで私にとっては機能しました。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = UITableViewCell()
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
return cell
}
Swift 5アップデート:
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
私はこの投稿から答えを得ました:iOS 8 UITableViewセパレータインセット0が機能していません
このコードをあなたの UITableViewController
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
viewDidLayoutSubviews
は必要ありません
あなたの UITableViewCell
Interface BuilderのAttributes Inspectorに移動し、「15」を0に変更します。変更するすべてのセルに対してこれを実行します。
に追加[cell setLayoutMargins:UIEdgeInsetsZero];
する必要があるかもしれませんtableViewCell
UITableViewCell
left
および/またはright
フィールド。(デフォルトではleft: 15
、right: 0
)それがどのように機能するか見てください(を使用left: 100
):
結果:
UITableViewController
2つのインセット設定を継承し、さらにfalse willDisplayCell
に設定preservesSuperviewLayoutMargins
する必要がありました。Swiftでは次のようになります。
override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
cell.preservesSuperviewLayoutMargins = false
}
}
preservesSuperviewLayoutMargins = false
デフォルト値はすでにfalseであるため、設定する必要はありません
iOS 9以降のSwiftの場合
カスタムを使用する場合UITableViewCell
:
override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}
次にあなたのためUITableView
にviewDidLoad
:
self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;
iPadで問題が発生している人のために-これは、iPhoneと同じ状態になります。その後、separatorInset
必要に応じてを調整できます。
tableView.cellLayoutMarginsFollowReadableWidth = false
iOS 9.3およびSwift 2.2でテスト済み。willDisplayCell
セルcellForRowAtIndexPath
を作成する場所ではなく、セルを表示する直前に呼び出されるコードを配置してください。
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
}
次のoverride
ように、の関数に追加しますUITableViewController
。
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
上記のいずれも、Swift 2.2およびXcode 7.3.1では機能しませんでした。
すべての中で最も単純なソリューションであることが判明しました。コードは必要ありません。インスペクターTableViewCell
でレイアウトマージンの値を変更するだけですUITableView
:
Swift 3の場合:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
}
これらのソリューションはどれもiPadでは機能しませんが、両方のデバイスをカバーするソリューションを考え出しました。
再利用可能なセル:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
...[other code]...
[cell setLayoutMargins:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
return cell;
}
再利用できないセルの場合:
- (void)removeSeparatorInset:(UITableView*)tableView{
NSArray *cells = [tableView visibleCells];
for (UITableViewCell *cell in cells){
[cell setLayoutMargins:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}
-(void) viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
[self removeSeparatorInset:self.tableView];
}
このアプローチをさらに詳しく説明します。
@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;
UITableView
&はどちらのプロパティも使用できますUITableViewCell
。後者は、実際には&のUIView
親クラスであるのプロパティです。UITableView
UITableViewCell
UITableView
プロパティがありますseparatorInset
。UITableView
行セパレーターのインセットをゼロに設定します。またseparatorInset
、ストーリーボードから変更することもできます