【问题标题】:Extra 20px Top Inset UIScrollView Issue额外的 20px 顶部插入 UIScrollView 问题
【发布时间】:2015-06-25 13:59:28
【问题描述】:

已询问有关此问题的问题。我尝试了一切,但无法解决我的问题。我挣扎了 2 个小时,现在我在这里发布。

问题:UIScrollView 的顶部 contentInset 总是有 20px 的额外空间。

我有 viewcontroller xib,而不是故事板。

首先,stackoverflow 上的相关问题及其解决方案假设 UIScrollView 是 UIViewController 的根视图。但我的滚动视图不是根视图,因此可能是

self.automaticallyAdjustsScrollViewInsets = NO;

不工作

  • 我有一个带有前导空格(0,超级视图),尾随空格(0,超级视图),顶部空格(0,超级视图)的 HeaderView 和固定高度。
  • 标题视图下方是带有前导空格的滚动视图(0,超级视图), 尾随空间(0,superview),底部空间(0,superview)和垂直 空格(0,标题视图)
  • 滚动视图中有一个内容视图。这个观点有 滚动视图的前导(0)、尾随(0)、底部(0)和顶部(0)空间。

这是额外的 20 px 顶部插图的屏幕截图。额外的 20px 是 UIScrollView 的白线和浅灰色内容之间的黑色区域,我无法修复此问题。

我做错了吗?自动布局约束看起来不错。

【问题讨论】:

    标签: ios objective-c uiscrollview


    【解决方案1】:

    您是否将控制器嵌入到导航控制器中?似乎 iOS 在顶部留下了 20px 的状态栏,但您的控制器没有。

    无论哪种方式,如果在调用 super 之前调整 scrollView,在 viewDidLoad 中它应该可以工作:

       - (void)viewDidLoad {
        self.automaticallyAdjustsScrollViewInsets = NO;
        self.scrollView.contentInset = UIEdgeInsetsMake(0,0,0,0); 
        [super viewDidLoad];
        }
    

    iOS 可能会自动强制您的 scrollView 具有 20px TOP contentInset 的原因是因为它可能是您的主视图中索引为 0 的视图。你可以在这里进一步阅读:http://b2cloud.com.au/how-to-guides/uiviewcontroller-changes-in-ios7

    默认情况下,一个 UIViewController 会自动调整内容 它的 UIScrollView(包括 UITableViews)在视图索引 0 处的插图, 最后面。这意味着如果有按钮、标签或任何其他 在您的表格视图后面查看,您不会免费获得此行为。

    【讨论】:

    • 这是索引的东西。谢谢。
    【解决方案2】:

    这是 Pauls 在 SWIFT 4 中接受的答案:

    override func viewDidLoad() {
        backGroundScrollView.contentInsetAdjustmentBehavior = .never
        backGroundScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
    
        super.viewDidLoad()
    }
    

    【讨论】:

    • backGroundScrollView.contentInsetAdjustmentBehavior = .never 足以为我解决问题。
    【解决方案3】:

    对于 iOS 11.1 及更高版本:

    斯威夫特 5

    if #available(iOS 11.1, *) {
        self.tableView.verticalScrollIndicatorInsets.top = CGFloat.leastNonzeroMagnitude
    }
    

    ObjC

    if (@available(iOS 11.1, *)) {
        self.tableView.verticalScrollIndicatorInsets = UIEdgeInsetsMake(__DBL_MIN__, 0, 0, 0);
    }
    

    我不使用0,而是使用CGFloat.leastNonzeroMagnitude 的原因是在某些情况下,当值设置为0 时,iOS 会应用默认值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-17
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      相关资源
      最近更新 更多