iOS 7 でプレーンなジェーン UITableView を UIViewController にドラッグしました。
最初のセルが開始する前に、スペースの垂直方向のオフセットがあります。どうすればそれを取り除くことができますか?最初の行を、UITableView が実際に始まる場所の上端にもっと近づけたいと思います。私は大きなオフセットを求めませんでしたか?
何か案は?
iOS 7 でプレーンなジェーン UITableView を UIViewController にドラッグしました。
最初のセルが開始する前に、スペースの垂直方向のオフセットがあります。どうすればそれを取り除くことができますか?最初の行を、UITableView が実際に始まる場所の上端にもっと近づけたいと思います。私は大きなオフセットを求めませんでしたか?
何か案は?
デフォルトでは、Table View Controller はコンテンツをナビゲーション バーの下にパディングするので、その下のコンテンツをスクロールして、ぼやけた状態でナビゲーション バー/ツールバーの下に表示できます。
ナビゲーション バーの下から移動するために 44 (おそらく 64) ピクセルに配置しているように見えますが、これは既に補正されているため、大きなギャップが生じます。
IB のストーリーボード/xib に移動し、ナビゲーション バーのものの下にあるショー コンテンツのチェックを外します。
スクロール ビューのコンテンツ インセットを自動的に調整したくない場合は、automaticAdjustsScrollViewInsets を NO に設定します。(automaticAdjustsScrollViewInsets のデフォルト値は YES です。)
self.automaticallyAdjustsScrollViewInsets = NO;
viewControllerを閉じた後、tableViewのcontentOffsetが(0、-64)に変更されました。
私の解決策は少し奇妙でした。他のすべての回答を試しましたが、成功しませんでした。問題を解決した唯一のことは、.xib のコントロール ツリーで tableView の位置を切り替えることでした。
次のような親ビューの最初のコントロールでした。
ImageViewの直後にtableViewを移動したところ、うまくいきました:
テーブルビューを最初の位置に配置すると問題が発生し、テーブルビューを別の位置に移動すると問題が解決したようです。
PD 私は autoLayout もストーリーボードも使用していません
これが誰かを助けることができることを願っています!
それは私の同様の問題を解決します:
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
iOS 9 では、このページの他の回答はどれもうまくいきませんでした (つまり、ストーリーボードのボックスのチェックを外し、に設定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
は効果がありませんでした。
が Navigation Controller 内に埋め込まれている64
場合、Table View の上部に高さのギャップが生じることがあります。UIViewController
以前は、白紙の状態にした後に制約が正しくなることを期待して、すべてを再作成するだけでした。
TIL: に垂直方向の制約を加えたくない場合はTop Layout Guide
、Option
キーを押したままにして にアクセスできますContainer Margin
。
次に、Top Space to Superview
定数が に設定されていることを確認し0
ます。これは少なくとも私にとってはうまくいきました。
UITableView の前に空の UIView を追加すると (または、ScrollView や TextView などのスクロール可能なビューがあれば)、うまくいく可能性があります。
ときどき、このひどい状況に戻ることがありますが、それはまだまったく知られていません。では、今後の記念に…
最近、私はこの回避策で修正しています。
理由は聞かないでください。UIKit の深いところにあるバグだと思います。
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();
}
}
コンテナー ビューに UITableViewController を埋め込んでいました。不要な 64 ポイントの垂直方向のスペースを取り除くには、Interface Builder で「Adjust Scroll View Insets」のチェックを外し、以下のように 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);
}
}
ストーリーボードに移動すると、テーブルを選択してオフセットを変更できます。属性インスペクタのテーブル ビュー セクションで、左側のセパレータ インセットを 0 に変更します。
本当の解決策は、テーブルビューの上下の制約をtopMarginとbottomMarginに等しく設定することだと思います。上部レイアウト ガイドと下部レイアウト ガイドではありません。これにより、automaticAdjustsScrollViewInsets を true に保つことができます。