UIScrollView可滚动内容大小模糊

时间:2013-09-26 18:45:38

标签: ios swift uiscrollview autolayout interface-builder

研究员, 我在Interface Builder(Xcode 5 / iOS 7)中遇到AutoLayout问题。 这是非常基本和重要的,所以我想每个人都应该知道这是如何正常运作的。如果这是Xcode中的一个错误,那么它就是一个关键错误!

所以,每当我有一个像这样的视图层次结构时,我就会遇到麻烦:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollView具有严格的约束条件,例如每边50 px(没问题)。 然后我给UILabel添加了一个Top Space约束(没问题)(我甚至可以固定标签的高度/宽度,不做任何改变,但由于Label的内在大小,应该是不必要的)

当我向UILabel添加尾随约束时,麻烦就开始了:

例如,尾随空间:Superview Equals:25

现在出现了两个警告 - 我不明白为什么:

A)可滚动内容大小歧义(滚动视图具有不明确的可滚动内容高度/宽度)

B)错位视图(预期标签:x = -67实际:x = 207

我在一个刚刚下载的新项目中做了这个最小的例子,我附上了截图。如您所见,Interface Builder期望Label位于UIScrollView边界之外(橙色虚线矩形)。使用Resolve Issues Tool更新Label的框架会将其移动到那里。

请注意:如果用UIView替换UIScrollView,行为就像预期的那样(Label的框架是正确的,并且根据约束条件)。因此,似乎UIScrollView存在问题,或者我错过了重要的事情。

当我按照IB的建议运行应用程序而不更新Label的框架时,它定位得很好,确切地说它应该是什么,并且UIScrollView是可滚动的。 如果我更新框架,则标签不在视线范围内,并且UIScrollView不会滚动。

帮助我Obi-Wan Kenobi!为什么模棱两可的布局?为什么错位观点?

您可以在此处下载示例项目,如果您能弄清楚发生了什么,请尝试: https://github.com/Wirsing84/AutoLayoutProblem

Illustration of the problem in Interface Builder

34 个答案:

答案 0 :(得分:952)

注意:在iOS> 10.0,这还没有经过测试;因此在某些情况下解决方案可能不完整。

所以我只是这样解决了:

  1. UIScrollView 内添加一个UIView(我们可以称之为contentView);

  2. 在此contentView设置顶部,底部,左侧和右侧边距为0 (当然来自scrollView superView ); 设置水平和垂直对齐中心;

  3. <强>成品

    现在,您可以在contentView添加所有观看次数,contentSize的{​​{1}}将根据scrollView自动调整大小。

    <强>更新

    video在以下评论中发布的@Sergio涵盖了一些特殊情况。

答案 1 :(得分:93)

此错误花了我一段时间来追踪,最初我尝试固定ScrollView的大小,但错误消息清楚地说“内容大小”。我确保从ScrollView顶部固定的所有内容也固定在底部。这样,ScrollView可以通过查找所有对象的高度来计算其内容高度。限制。这解决了模糊的内容高度,宽度非常相似......最初我在ScrollView中居住了大部分X,但我还必须将对象固定到ScrollView的侧面。我不喜欢这样,因为iPhone6可能有更宽的屏幕,但它会消除“模糊内容宽度”错误。

答案 2 :(得分:60)

我自己回答的问题UIScrollView + Centered View + Ambigous Scrollable Content Size + many iPhone sizes的回答。

但它也完全涵盖了你的情况!

因此,这是最简单情况的初始状态:

  1. 每个边缘都有0个约束的scrollView
  2. 按钮居中水平和垂直固定宽度和高度约束
  3. 当然 - 恼人的警告 Has ambiguous scrollable content widthHas ambiguous scrollable content height
  4. 1

    所有,我们要做的是:

    • 添加2个附加约束,例如&#34; 0&#34;用于我们视图的尾随和/或底部空间(请参阅下面屏幕截图中的示例)。

    重要提示:您必须添加尾随和/或底部约束。不是&#34;领先和顶级&#34; - 它不起作用!

    2

    您可以在example project中查看,以了解如何解决此问题。

    <强> P.S。

    根据逻辑 - 这个动作应该导致&#34;冲突的约束&#34;。但不!

    我不知道它的工作原理以及Xcode如何检测哪个约束更优先(因为我没有为这些约束明确设置优先级)。 如果有人解释,为什么它在下面的评论中起作用,我会感激不尽。

答案 3 :(得分:48)

您需要创建UIView作为UIScrollView的子视图,如下所述:

  • UIViewController
  • UIView&#39;主视图&#39;
    • UIScrollView
      • UIView&#39;容器视图&#39;
        • [您的内容]

第二步是制定UIScrollView约束。我使用topView的顶部,底部,前导和尾随约束来做到这一点。

接下来,我添加了UIScrollView容器的约束,这是问题的开始。当您放置相同的约束(顶部,底部,前导和尾随)时,Storyboard会发出警告消息:

&#34;具有模糊的可滚动内容宽度&#34;和&#34;具有不明确的可滚动内容高度&#34;

继续上述相同的限制,只需将约束 Equal Height Equal Width 添加到容器视图主视图相关的UIScrollView。换句话说,容器视图的约束与UIScrollView的超级视图相关联。

之后,您的故事板中不会出现警告,您可以继续为子视图添加约束。

答案 4 :(得分:35)

Xcode 11 +,Swift 5

如果您想知道为什么所有答案都不再起作用,请确保将内容视图(已放入滚动视图的内容视图)固定到滚动视图的内容布局指南,然后不适用于框架布局指南。

内容视图的边缘(前导,尾随,顶部,底部)不应像图像上的引线那样固定-参见《框架布局指南》

Not like this

但是像这样-到内容布局指南。

Select Content Layout Guide from dropdown

enter image description here

然后大多数答案将对您有用。

现在最简单的方法是这样的:

  1. 将滚动视图放入根视图
  2. 将滚动视图的所有侧面固定到超级视图
  3. 使用另一个UIView(将其称为内容视图)并将其放入滚动视图中
  4. 固定内容视图的所有侧面以滚动视图的内容布局指南
  5. 将内容视图的宽度固定为等于滚动视图的“框架布局指南”
  6. 以任何所需的方式固定内容视图的高度(在下面的示例中,我仅使用恒定的高度约束)

最简单的实现中的总体结构如下所示:

enter image description here

答案 5 :(得分:27)

iOS 12,Swift 4

使用autolayout的最简单方法:

  1. 添加UIScrollView并将其0,0,0,0固定到superview(或您想要的尺寸)
  2. 在ScrollView中添加UIView,将0,0,0,0固定到所有4个边并将其horizontallyvertically居中。
  3. 在尺寸检查器中,将bottomalign center Y优先级更改为250.(对于水平滚动更改trailingalign center X
  4. 将您需要的所有视图添加到此视图中。 不要忘记在最低视图上设置底部约束。

答案 6 :(得分:24)

我终于弄明白了,我希望这更容易理解。

您可以通过向滚动视图添加基本UIView作为“内容视图”来绕过该警告,正如他们所提到的那样,并使其与滚动视图的大小相同,并在此内容视图中设置这6个参数。

enter image description here

如您所见,您需要总共6个参数!哪个..在正常情况下,你复制2个约束,但这是避免这个故事板错误的方法。

答案 7 :(得分:15)

我知道我可能会迟到,但是下一个解决方案解决了这类问题而无需其他代码,只是使用了故事板:

对于您的内容视图,您需要将前导/尾随/上/下空格的约束设置为scrollview,这不会更改内容视图框,如下所示:enter image description here

当然,您需要为内容视图创建其他约束,以便滚动视图可以知道内容大小。例如,设置固定高度和中心x。

希望这有帮助。

答案 8 :(得分:6)

快速查看这个以及如何使滚动视图工作并使用自动布局完全滚动的点教程。现在,唯一让我感到困惑的是为什么滚动视图的内容大小总是比必要的大..

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/

答案 9 :(得分:6)

我有同样的问题。取消选中此复选框。由于您是在代码中设置内容大小。 enter image description here

答案 10 :(得分:3)

就我而言,我收到了iPad中内容大小和内容大小歧义不正确的问题,但在iPhone上可以使用。我在情节提要板上进行了以下更改以解决此问题。

  1. 在UIView中添加滚动视图,并在0、0、0、0处添加前导,顶部,尾部和底部约束。
  2. 根据例如的要求设置滚动视图的高度。 100。
  3. 将UIView添加到滚动视图,并将前,上,后和下约束添加到0,0,0,0,并对齐center(X)和center(Y)约束。
  4. 在滚动视图的大小检查器中取消选择“内容布局指南”。

答案 11 :(得分:3)

见下图:scrollview中的内容视图纵向和横向集中。 你有歧义错误,总是确保从你的内容视图添加到scrollview中的两个是1).button space to container.2)尾随空间到约束,在屏幕截图中突出显示,

滚动中的这些约束意味着您可以在内容视图高度或宽度之后滚动多少。

enter image description here

它可能对你有所帮助。

答案 12 :(得分:2)

对我来说,添加contentView并没有按照建议真正发挥作用。此外,由于添加了视图,它会产生开销(尽管我不认为这是一个大问题)。对我来说最有效的只是关闭我scrollView的歧义检查。一切都很顺利,所以我认为在像我这样的简单案例中它是可以的。但请记住,如果scrollView的其他约束中断,Interface-Builder将再向您发出警告。

enter image description here

答案 13 :(得分:2)

正在努力使用uiscrollview不滚动的人只需使用上一个视图的底部布局(位于内容视图中)设置内容视图的底部约束。不要忘记删除中心Y约束。

休息所有约束与上面定义的相同。 Scrollview只关注从内容视图中获取最大高度,我们将其设置为最后视图的底部约束,这意味着scrollview会自动更改其内容偏移。

在我的情况下,最后一个视图是UILable,没有行属性= 0(根据其内容自动调整其高度),因此它动态增加uilable的高度,最终我们的可滚动区域增加,因为uilable的底部布局与我们的内容一致视图的底部,强制scrollview增加其内容偏移量。

答案 14 :(得分:2)

我通过使用&#34;解决自动布局问题&#34;解决了我的观点。 &GT; &#34;添加缺失的约束&#34;选择视图 enter image description here

以下两个约束解决了我的问题:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

其中: trailing,bottom是UIScrollView的尾随底部

答案 15 :(得分:2)

@Matteo Gobbi的答案是完美的,但在我的情况下,滚动视图无法滚动,我删除&#34; 对齐中心&#34;并添加&#34; height&gt; = 1 &#34;,滚动视图将变为可滚动

答案 16 :(得分:1)

我在youTube上制作了一个视频 Scroll StackViews using only Storyboard in Xcode

我认为这里可以出现两种情况。

scrollView中的视图 -

  1. 没有任何内在内容大小(例如UIView
  2. 确实有自己的内在内容大小(例如UIStackView
  3. 对于两种情况下的垂直可滚动视图,您需要添加这些约束:

    1. 来自顶部,左侧,底部和右侧的4个约束。

    2. 滚动视图的宽度相等(停止水平滚动)

    3. 对于具有其内在内容高度的视图,您不需要任何其他约束。

      enter image description here


      对于没有任何内在内容高度的视图,您需要添加高度约束。仅当高度约束大于scrollView的高度时,视图才会滚动。

      enter image description here

答案 17 :(得分:1)

如果UIScrollView仍然存在问题,只需关闭内容布局指南 (在xcode Interface Builder中选择ScrollView->在右侧面板中选择Size inspector->取消选择“ Content Layout Guides”) 或尝试以下步骤:xcode 11 scroll view layouts-它可以 对于新的布局样式很有用。在macOS 10.15.2,Xcode 11.3.1上适用于05.02.2020

see screenshot

答案 18 :(得分:1)

对于任何视图,框架及其内容的大小都是相同的,即,如果您有一些内容(例如图像)的大小为200 * 800,则其框架也是200 * 800。

对于scrollview的内容不是这样。内容通常大于scrollView的框架大小。如果内容的宽度相同,则只能垂直滚动。如果高度相同,则只能水平滚动。因此,它是唯一需要6个约束而不是4个的视图。对于其他任何具有4个以上 required 约束的视图,都会引起冲突。


要设置滚动视图,其内容和滚动位置,您基本上需要回答三个问题:

  1. 我的框架有多大?即在任何给定的时刻,scrollview应该有多大?例如我只想使用屏幕高度的一半,所以
scrollview.frame = (x: 0, y:0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height / 2)
  1. 我需要多少滚动空间?即,内容有多大?例如框架的宽度仅为500点,但是您可以将图像设置为7000点,这将需要相当长的时间才能水平滚动。或者让它恰好是500个宽度的点,那么这意味着不会发生水平滚动。

  2. 此刻您滚动了多少?假设您的内容(或图片)宽度为7000,帧大小仅为500。要到达图片的末尾,您需要向右滚动6500点。第三部分确实不影响约束。您现在可以忽略它。理解它只会帮助scrollView如何工作。

解决方案

基本上,如果您遗漏了2个额外的约束(关于内容大小),则布局引擎会由于含糊不清而抱怨。它不会知道内容的哪些区域被隐藏(在scrollView中不可见),内容的哪些区域(在scrollView中可见)未被隐藏。

因此请确保同时为内容添加尺寸限制

但是有时候我不会在视图中添加 size 约束,而它只是有效。为什么会这样?

如果您添加到滚动视图中的所有内容都限制在滚动视图的边缘,则随着内容的增长,滚动视图将增加容纳空间。只是您可能使用UIViewintrinsicContentSize的{​​{1}},所以scrollView仍会抱怨其 content 的歧义。但是,如果您使用过0并且它具有非空的文本,那么将设​​置它的UILabel(基于字体大小,文本长度和换行符等),因此scrollView不会抱怨它的含糊不清。

答案 19 :(得分:1)

使用contentView(UView)作为UIScrollView内的容器,坚持边缘(topbottomtrailingleading) superview(UIScrollView)和contentView应该有equalwidthequalheight来监督。这些是限制因素。并调用方法:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

解决了我的问题。

答案 20 :(得分:0)

在Interface Builder的大小检查器中将ViewController(持有UIScrollView的那个)大小设置为Freeform,所有这些都应该有效。

Freeform setting in Size inspector in Interface Builder for the containing UIViewcontroller

答案 21 :(得分:0)

  

你必须确保有一种方法可以连续进行   从scrollview的顶部到底部的约束线。   [-X-X-X]

在我的情况下 - 水平滚动滚动视图 - 我还需要为滚动视图的每个子项添加宽度和高度约束,尽管Apple's technical note并没有告诉你这个。

答案 22 :(得分:0)

如前面的答案中所述,您应该在滚动视图中添加自定义视图:

The custom view is the ContentView marked in the image

将所有子视图添加到内容视图中。 在某些时候,您会看到滚动内容视图有不明确的内容大小警告,您应该选择内容视图并单击&#34;解决自动布局问题&#34;按钮(位于IB布局的右下角),然后选择&#34;添加缺失约束&#34;选项。

enter image description here

从现在开始运行项目时,滚动视图会自动更新其内容大小,无需其他代码。

答案 23 :(得分:0)

如果有人发现你注意到右侧滚动条滚动但内容不动的行为,这个事实可能值得考虑:

  

您还可以在滚动视图的内容和滚动视图外部的对象之间使用约束,为滚动视图的内容提供固定位置,使该内容看起来浮动在滚动视图上。

那是来自Apple的documentation。例如,如果您不小心将顶部的Label / Button / Img / View固定到滚动区域外的视图(也许是滚动视图上方的标题或某些内容?)而不是contentView,则会冻结整个contentView。

答案 24 :(得分:0)

快速4+方法:

1)将UIScrollView的上,下,左,右页边距设置为0

2)在UIScrollView内添加一个UIView,并将上,下,前,后边距设置为0(等于UIScrollView边距)。

3)最重要的部分是设置宽度和高度,其中高度限制应该具有较低的优先级

private func setupConstraints() {
    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

答案 25 :(得分:0)

垂直滚动

  1. 将约束为0,0,0,0的UIScrollView添加到超级视图。
  2. 在ScrollView中添加一个UIView,并将其约束0,0,0,0用作超级视图。
  3. 向UIScrollView添加相同的UIView宽度约束。
  4. 向UIView添加高度。
  5. 向UIView添加具有约束的元素。
  6. 对于最靠近底部的元素,请确保其对UIView底部具有约束。

答案 26 :(得分:0)

import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // you can use here any of your subview

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

输出:

enter image description here

答案 27 :(得分:0)

[在XCode 7.2和iOS 9.2中测试]

为我设置故事板错误和警告的原因是将滚动视图的内在大小和内容视图(在我的情况下是一个堆栈视图)设置为占位符。此设置位于Storyboard中的“大小”检查器中。它说 - 设置设计时内在内容大小只影响在Interface Builder中编辑时的视图。视图在运行时不会具有此内在内容。

所以,我想通过设置它我们不会出错。

注意:在故事板中,我已将scrollview的所有边缘固定到superview,并将stackview的所有边缘固定到scrollview。在我的代码中,我已将 translatesAutoresizingMaskIntoConstraints 设置为scrollview和stackview的false。我还没有提到内容大小。当堆栈视图动态增长时,故事板中设置的约束可确保堆栈可滚动。

故事板警告让我发疯,我不想横向或纵向居中,只是为了抑制警告。

答案 28 :(得分:0)

我得到了同样的错误..我已经完成了以下

  1. 视图(上海华)
  2. ScrollView 0,0,600,600
  3. 在ScrollView中的UIView:0,0,600,600
  4. UIView包含图像视图,标签
  5. 现在为scrollView(2)添加前导/尾随/顶部/底部,然后添加UIView(3)。

    选择View(1)和View(3)设置相同的高度和重量..它解决了我的问题。

    我完成了视频会有所帮助:

    https://www.youtube.com/watch?v=s-CPN3xZS1A

答案 29 :(得分:0)

我所做的是创建一个单独的内容视图,如下所示。

内容视图是自由形式的,可以添加所有子视图,并使用与contentView相关的约束。

UIScrollView已添加到主视图控制器中。

以编程方式,我将通过IBOutlet链接的contentView添加到类中,并设置UIScrollView的contentView。

UIScrollView with ContentView via Interface Builder

答案 30 :(得分:0)

使用自动版式

将滚动视图添加到定义良好的视图内,然后将堆栈视图添加到滚动视图内

从滚动视图和堆栈视图向其相关的超级视图添加顶部,左侧,右侧,底部,中心X和中心Y约束

请确保将约束从堆栈视图链接到合法的超级视图(滚动视图),因为当前的默认设置是添加“对齐顶部”约束而不是“顶部空间”约束。

答案 31 :(得分:-1)

Xcode 11 +,Swift 5。

根据@WantToKnow答案,我解决了问题,我准备了videocode

答案 32 :(得分:-2)

滚动视图中的所有子视图必须具有触及滚动视图所有边缘的约束,如文档中所述,滚动视图的高度和宽度由子视图中的度量自动计算,这意味着您需要对宽度以及高度的顶部和底部约束具有尾随和前导约束。

答案 33 :(得分:-3)

我认为从现在开始这是一个10秒的工作。我在XCode 7.3中观察到它并在其上制作了一个视频。点击这里:

https://www.youtube.com/watch?v=yETZKqdaPiI

您需要做的就是向UIScrollView添加具有相同宽度和高度的子视图。然后选择ViewController并按Reset to suggested constraint。请查看视频以获得清晰的理解。

由于