IOS 7では、UITableViewCellsにはiOS 6にはないセルの区切りに改行があることに気付きました。この改行を取り除く方法はありますか?セパレーターをnoneに変更してから、セパレーターの色でUIViewを作成しても、それにもかかわらず、白いセパレーターが発生します。
iOS7の場合:
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
iOS8の場合:
まず、次のようにテーブルビューを構成します。
if ([self.tableView respondsToSelector:@selector(layoutMargins)]) {
self.tableView.layoutMargins = UIEdgeInsetsZero;
}
次に、cellForRowAtIndexPath:メソッドで、セルを次のように構成します。
if ([cell respondsToSelector:@selector(layoutMargins)]) {
cell.layoutMargins = UIEdgeInsetsZero;
}
注:両方のiOSバージョンをサポートするには、layoutMarginsとseparatorInsetの両方を含めます
ストーリーボードから「Separator Inset」を設定することもできます。
IOSの古いバージョンをサポートする場合は、このメソッドを呼び出す前に、このメソッドの可用性を確認する必要があります。
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
理解した。
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
iOSはセルおよびテーブルビューにlayoutMarginsプロパティを導入します。
このプロパティはiOS 7.0では使用できないため、割り当てる前に確認する必要があります!
ただし、Appleはセルに**プロパティを追加して、Table Viewのマージン設定を継承できないようにします。このように、セルはTable Viewとは無関係に独自のマージンを構成できます。オーバーライドとして。
このプロパティはpreservesSuperviewLayoutMarginsと呼ばれます。NOに設定すると、テーブルビューのlayoutMargin設定を独自のセルのlayoutMargin設定でオーバーライドできます。両方とも時間を節約し(テーブルビューの設定を変更する必要はありません)、より簡潔です。詳細な説明については、マイクアブドラの回答を参照してください。
注:これは、Mike Abdullahの答えに表されているように、適切で、面倒ではない実装です。セルのpreservesSuperviewLayoutMargins = NOを設定すると、Table Viewがセル設定を上書きしないようになります。
最初のステップ-セルの余白を設定します:
/*
Tells the delegate the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath)
{
// Remove seperator inset
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
}
セルのpreservesSuperviewLayoutMarginsプロパティをNOに設定shouldテーブルビューがセルマージンを上書きしないようにします。場合によっては、正常に機能しないようです。
2番目のステップ-すべてが失敗した場合にのみ、Table Viewのマージンをブルートフォースすることができます:
/*
Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if self.tableView.respondsToSelector("setSeparatorInset:") {
self.tableView.separatorInset = UIEdgeInsetsZero
}
if self.tableView.respondsToSelector("setLayoutMargins:") {
self.tableView.layoutMargins = UIEdgeInsetsZero
}
}
...そしてそこに行きます!これは、iOS 7と同様にiOS 8でも動作するはずです。
注:iOS 8.1および7.1を使用してテストしました。私の場合、この説明の最初のステップを使用するだけでした。
2番目のステップは、レンダリングされたセルの下に未入力のセルがある場合にのみ必要です。テーブルがテーブルモデルの行数より大きい場合。 2番目の手順を実行しないと、異なるセパレータオフセットが発生します。
選択した答えは私にはうまくいきませんでした。しかし、これははい、IOS 2.0から動作します:
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
アプリ全体の永続的なソリューションの場合、application:didFinishLaunchingでこれを呼び出します..すべてのテーブルビューが「修正」されます
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
[[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero];
}
IOS 8では、Seth McFarlaneの投稿 here に基づいて、layoutMarginsの処理を開始する必要があります。以下は私のためにそれをしました:
ApplicationDidFinishLaunchingで、次を実行します。
if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) {
[[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero];
}
UITableViewで次のカテゴリを作成します。
@interface UITableView(WJAdditions)
-(void) wjZeroSeparatorInset;
@end
@implementation UITableView (WJAdditions)
-(void) wjZeroSeparatorInset {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
self.layoutMargins = UIEdgeInsetsZero;
}
#endif
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if ([self respondsToSelector: @selector(setSeparatorInset:)])
self.separatorInset = UIEdgeInsetsZero;
}
#endif
}
@end
UITableViewsで、初期化後すぐに呼び出します
[self wjZeroSeparatorInset];
UITableViewControllersでは、次のものが必要です。
-(void) viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
UITableView* tv = self.tableView;
if ([tv respondsToSelector:@selector(setLayoutMargins:)]) {
[tv setLayoutMargins:UIEdgeInsetsZero];
}
}
IOS 8では、小さなバグがあるようです。セパレーターインセットのカスタム値は、テキストが含まれるセルには適用されません。インターフェイスビルダーとコードを使用して設定しようとしましたが、どちらも機能しませんでした。私もバグレポートを提出しました。
それまでの間、これを達成するための小さな回避策があります。セルに線を引くだけです。 UITableViewCell
のサブクラスを作成し、drawRect
メソッドをオーバーライドします。また、UITableView
のseparatorプロパティをNoneに設定することを忘れないでください。これがコードです。 Swiftにありますが、基本的にCなので、Objective-Cでも同じことを使用できます。
override func drawRect(rect: CGRect) {
super.drawRect(rect)
let context = UIGraphicsGetCurrentContext()
CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color
CGContextSetLineWidth(context, 2) // separator width
CGContextMoveToPoint(context, 0, self.bounds.size.height)
CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height)
CGContextStrokePath(context)
}
SeparatorInsetをリセットすると、この問題が解決されます。
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:self.tableView.separatorInset];
}
ソリューション:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
TableViewのseparatorInsetをUIEdgeInsetsZeroに設定すると、同時にセクションタイトルの左マージンが壊れるように注意してください! (少なくともiOS 7.1ではそうです)
TableView:titleForHeaderInSection:を使用してセクションタイトルを表示し、UITableViewCells間に改行がないという希望の効果を引き続き取得する場合は、tableViewではなくセルにseparatorInsetを直接設定する必要があります。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// ...
[cell setSeparatorInset:UIEdgeInsetsZero];
iOS8 +の場合、これでうまくいきました。
tableView.layoutMargins = UIEdgeInsetsZero
およびcellForRowAtIndexPath
メソッド内:
cell.layoutMargins = UIEdgeInsetsZero;
@implementation UITableView (HGApperance)
-(void)setSeparatorXMargin:(CGFloat)margin{
// iOS 7
if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
[self setSeparatorInset:UIEdgeInsetsZero];
}
if ([self respondsToSelector:@selector(layoutMargins)]) {
self.layoutMargins = UIEdgeInsetsZero;
}
}
@end
UITableviewCellの場合、Williamの answer は完璧に機能します。
iOS8以上へ
すべてのソリューションが私のように機能しない場合は、UITableViewCell
のサブクラスを使用し、layoutSubviews
メソッドをオーバーライドした可能性があります。2つの条件を満たしている場合は、読み進めてください。 。
ステップごとに実行または確認します。
1、UITableView
を割り当てて初期化した後、layoutMargins
プロパティを設定します。
_if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
_tableView.layoutMargins = UIEdgeInsetsZero ;
}
_
2、メソッド- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
で、カスタムUITableViewCell
を割り当てて初期化した後、そのlayoutMargins
プロパティを設定します。
_if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
cell.layoutMargins = UIEdgeInsetsZero ;
}
_
3、最も重要な部分が入ります。UITableViewCellの- (void)layoutSubviews
メソッドをオーバーライドする場合、そのスーパーを呼び出すことを忘れないでください。
_- (void)layoutSubviews
{
[super layoutSubviews] ;
// layout the subviews
}
_
- (void)viewDidLoad
{
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[super viewDidLoad];
// Additional setup
}
注:setSeparatorStyle行は、スーパーコールの上にある必要があります。
IOS 8.4上のXamarin.iOSでUITableViewセパレーターをLuis E. Pradoおよびキングウィザード。動作させるにはSeparatorInsetとLayoutMarginsの両方を設定する必要がありました。 iOS 8以降をターゲットにしているため、以前のiOSバージョンのチェックを作成しませんでした。
UITableViewまたはUITableViewCellレベルでUITableViewセパレーターの全幅を設定するために、次の2つのC#拡張メソッドを作成しました。目的の効果に応じて、これらの方法のいずれかまたは両方を使用できます(以下の説明を参照)。
ITableView
UITableViewプロパティを設定して、空のセルの後に表示されるセパレーターを変更します。このSetLayoutMarginsZeroメソッドは、関連するViewControllerのViewDidLoadメソッドから呼び出すことができます。
public static void SetLayoutMarginsZero(this UITableView tableView)
{
tableView.SeparatorInset = UIEdgeInsets.Zero;
tableView.LayoutMargins = UIEdgeInsets.Zero;
}
ITableViewCell
UITableViewCellプロパティを設定して、セルが入力された後に表示されるセパレータを変更します。このSetLayoutMarginsZeroメソッドは、TableViewSource GetCellメソッドから呼び出すことができます。
public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell)
{
tableViewCell.SeparatorInset = UIEdgeInsets.Zero;
tableViewCell.LayoutMargins = UIEdgeInsets.Zero;
tableViewCell.PreservesSuperviewLayoutMargins = false;
}