IOS 7では、プレーンジェーンUITableViewをUIViewControllerにドラッグしました。
これで、最初のセルが始まる前にスペースの垂直オフセットがあります。どうすればそれを取り除くことができますか?最初の行を、UITableViewが実際に開始する場所の上端にずっと近づけたいです。大きなオフセットを要求しませんでしたか?
何か案は?
デフォルトでは、Table View Controllerはナビゲーションバーの下にコンテンツを埋め込み、その下のコンテンツをスクロールして、ぼやけた状態でnavbar/toolbarの下に表示できるようにします。
ナビゲーションバーの下から外に移動するために44(たぶん64)pxに配置しているように見えますが、すでにこれを補正しているので、大きなギャップができます。
IBのストーリーボード/ xibに移動し、ナビゲーションバーのものの下でショーのコンテンツのチェックを外します。
iOS 7のUIViewControllerの実装には、開発者が以下を選択できる新しいオプションセットがあります。システムはUIScrollView、UITableViewおよび派生のインセットを自動的に追加します。
この動作を無効にするには、InterfaceBuilderでUIViewController選択したオブジェクトインスペクターで必要なすべてのUIViewControllerのこれらのボックスをオフにします。
詳細については:
スクロールビューのコンテンツインセットを自動的に調整したくない場合は、automaticallyAdjustsScrollViewInsetsをNOに設定します。 (automaticallyAdjustsScrollViewInsetsのデフォルト値はYESです。)
self.automaticallyAdjustsScrollViewInsets = NO;
同様の問題がありました。viewControllerを閉じた後、tableViewのcontentOffsetが(0、-64)に変更されました。
私の解決策は少し奇妙で、他のすべての答えを試してみましたが成功しませんでした。私の問題を解決した唯一のことは、.xibのコントロールツリーでtableViewの位置を切り替えることでした
これは、次のような親ビューの最初のコントロールでした:
ImageViewの直後にtableViewを移動し、動作しました:
テーブルビューを最初の位置に配置すると問題が発生し、テーブルビューを別の位置に移動すると問題が解決したようです。
P.D. autoLayoutもストーリーボードも使用していません
これが誰かを助けることを願っています!
それは私の同様の問題を解決します:
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
これを使ってみてください
tableView.separatorInset = UIEdgeInsetsZero;
明らかに、iOS7以外のものをサポートしている場合、オブジェクトを呼び出す前にオブジェクトがこのセレクターに応答することを確認する必要があります。
真剣に、contentOffset
を変更することは解決策ではありません。問題にパッチを当てているだけで、原因を修正しているのではありません。私は同じ問題に直面しており、grouped tableViewsの上部にパディングがあることがわかりました。私の場合、タイプをplainに設定するとうまくいきました。
うまくいけば、それが誰かを数分節約します。 Z.
IOS 9では、このページの他の回答はどれもうまくいきませんでした(つまり、Storyboardでボックスをオフにし、automaticallyAdjustsScrollViewInsets
をNO
に設定しました)。
私の回避策は、これが本当に不満でした:
- (void)viewDidAppear:(BOOL)animated {
self.tableView.contentOffset = CGPointMake(0.0, 0.0);
self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}
viewWillAppear
またはviewDidLoad
の同じ行は無効でした。
これは私のために働く:
- (void)loadView
{
[super loadView];
[self setAutomaticallyAdjustsScrollViewInsets:YES];
self.edgesForExtendedLayout = UIRectEdgeNone;
self.view.frame = CGRectZero;
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
UITableView(またはScrollViewやTextViewなどのスクロール可能なビュー)の前に空のUIViewを追加すると、運が良くなります。
Xamarin iOSでは、フォアグラウンドモーダルダイアログが閉じられた直後に、バックグラウンドのUITableViewControllerでこの問題が発生しました。フォアグラウンドに移行する過程で、UITableViewControllerにはインセットが設定されていました(iOSのどこかで):
このクラスはそれを解決しました
public class UITableViewControllerWithBugFix : UITableViewController {
public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
}
public override void ViewWillLayoutSubviews() {
if (TableView.ContentInset.Top != 0.0f)
TableView.ContentInset = UIEdgeInsets.Zero;
if (TableView.ScrollIndicatorInsets.Top != 0.0f)
TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;
base.ViewWillLayoutSubviews();
}
}
時々、私はこの恐ろしい状況に戻りますが、それはまだかなり知られていないことに気づきます。それで、将来の記憶のために...
最近、私はこの回避策で修正しています。
理由を聞かないでください。UIKitの深いバグだと思います。
コンテナービューにUITableViewControllerが埋め込まれていました。不要な64ポイントの垂直スペースを取り除くには、Interface Builderで[スクロールビューのインセットの調整]のチェックを外し、UITableViewControllerのviewWillAppearでUITableViewのcontentInsetを以下のように設定する必要がありました。
垂直スペースのサイズは、ナビゲーションバーのフレームの高さとyオフセットに一致するように見えます。この問題はiOS 7でのみ発生しました。
- (void)viewWillAppear:(BOOL)animated;
{
[super viewWillAppear:animated];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
const CGRect navBarFrame = self.navigationController.navigationBar.frame;
const CGFloat blankVerticalSpace = navBarFrame.Origin.y + navBarFrame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
}
}
私はiOS 11とxib、UITableviewControllerで同じ問題を抱えていましたが、以下のように解決しました
[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
Swift 3ソリューション:
class PaddingLessTableView : UITableView
{
override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
{
return nil
}
override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
{
return nil
}
}
いくつかの答えを試しました。ストーリーボードの設定を変更すると、左からポップアップするオーバーレイメニューでリップルの問題が発生しました。
ストーリーボードには空のUIViewControllerしかありません。そうでないと、すべてがプログラムで生成されます。
UIViewController内のUIView内のUITableViewにも同じ問題があります。つまり、UIViewControllerがNavigation Controllerに埋め込まれていると、セクションヘッダーの開始位置が下がりすぎます。ナビゲーションコントローラーなしで、すべて正常に動作します。
この問題を解決するために、UILabelを作成し、制約付きでUILabel bottom constraint = UIViewのtop constraintを配置しました(したがって、画面に表示されません。この追加コントロール(新しいラベル)でTableViewは正しく動作します。
inputsContainerView.addSubview(titleLabel)
inputsContainerView.addSubview(tableView)
// inputsContainerView
///////////////////////////////////////
inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true
// tableView
///////////////////////////////////////
tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true
// titleLabel - inserted to stop bad section header behavior
///////////////////////////////////////
titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
ストーリーボードに移動する場合は、テーブルを選択してオフセットを変更できます。属性インスペクターの[テーブルビュー]セクションで、左側の[セパレータインセット]を0に変更するだけです。
実際の解決策は、tableviewの上部および下部の制約をtopMarginおよびbottomMarginと等しくなるように設定することだと思います。上部レイアウトガイドおよび下部レイアウトガイドではありません。これにより、AdjustsScrollViewInsetsを自動的にtrueに保つことができます。
TableViewControllerをNavigationControllerまたはContainerViewに埋め込んだ場合、You have to constraint to margins instead of top Layout guide in Storyboard
。 Check constraint to margins when you are doing the constraints
私にとって他の方法は機能しませんでした。私はコメントできなかったので、ロバート・チェンスの答えを繰り返し言っています。