Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 动态创建UI元素时如何设置scrollview高度_Ios_Swift_Uiscrollview_Uistackview_Ios Autolayout - Fatal编程技术网

Ios 动态创建UI元素时如何设置scrollview高度

Ios 动态创建UI元素时如何设置scrollview高度,ios,swift,uiscrollview,uistackview,ios-autolayout,Ios,Swift,Uiscrollview,Uistackview,Ios Autolayout,在故事板上,在视图控制器内有一个滚动视图。导航栏和堆栈视图嵌入在scrollview中。 以编程方式,我在堆栈视图中一个接一个地添加一些UI元素 通过故事板,scrollview的约束设置为与安全区域相同的-顶部、底部、前导、尾随和宽度 导航栏约束-尾随、前导、顶部、宽度与超级视图相同 Stackview约束-尾随、前导、底部和宽度与superview相同 导航栏的底部与stackview的顶部相同,因此它们是一个在另一个之下 设置这些约束后,有关scrollview的错误-需要约束:Y位置或高

在故事板上,在视图控制器内有一个滚动视图。导航栏和堆栈视图嵌入在scrollview中。 以编程方式,我在堆栈视图中一个接一个地添加一些UI元素

通过故事板,scrollview的约束设置为与安全区域相同的-顶部、底部、前导、尾随和宽度

导航栏约束-尾随、前导、顶部、宽度与超级视图相同

Stackview约束-尾随、前导、底部和宽度与superview相同

导航栏的底部与stackview的顶部相同,因此它们是一个在另一个之下

设置这些约束后,有关scrollview的错误-需要约束:Y位置或高度

由于UI元素是动态添加到stackview的,因此如何设置故事板中的高度?有更好的方法吗

我尝试了“添加缺少的约束”选项,它为堆栈视图添加了一个恒定的高度,这对所有设备都不起作用。
感谢您的帮助,因为我是iOS应用程序开发新手。谢谢。

根据您的问题,您需要包含动态内容的滚动视图。你可以用两种方法解决你的问题。首先是使用Tableview而不是滚动视图。但我将尝试通过您的实施来回答您的问题。

  • 将ScrollView添加到ViewController,并使用其超级视图的顶部、底部、前导和尾随约束

  • 添加具有前导、尾随、顶部和底部约束的StackView

  • 无论何时以编程方式添加StackView内容,都可以调用
    self.view.layoutfneed()
    self.view.layoutSubviews()

  • 最后设置滚动视图的内容大小。
    scrollView.contentSize=CGSize(宽度:CGFloat,高度:CGFloat)


    • 空的
      UIStackView
      没有固有高度,因此IB/情节提要不知道如何满足滚动视图的
      contentSize

      您需要在设计时给它一个高度约束-它可以是任何值,因为它将在运行时更改。因此,给堆栈视图一个高度约束,例如,
      300

      当然,这不允许它在动态添加排列的子视图时“增长”,因此您有两个选项

      1-将高度约束设置为低优先级:

      这将满足IB的要求,但允许堆栈视图增长

      2-将高度约束设置为“占位符”:

      在构建时,此约束将被删除,再次允许堆栈视图增长


      编辑:使用第一个选项(低优先级),您的文档大纲应该是这样的:

      简单的例子。。。此类将添加30个标签作为初始空堆栈视图的排列子视图:

      import UIKit
      
      class StackInScrollViewController: UIViewController {
      
          @IBOutlet var theStackView: UIStackView!
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              for i in 1...30 {
                  let v = UILabel()
                  v.translatesAutoresizingMaskIntoConstraints = false
                  v.backgroundColor = .yellow
                  v.text = "This is Label \(i)"
                  theStackView.addArrangedSubview(v)
              }
      
          }
      
      }
      
      下面是故事板的来源:

      <?xml version="1.0" encoding="UTF-8"?>
      <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="v4n-Ck-gNo">
          <device id="retina4_7" orientation="portrait">
              <adaptation id="fullscreen"/>
          </device>
          <dependencies>
              <deployment identifier="iOS"/>
              <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
              <capability name="Safe area layout guides" minToolsVersion="9.0"/>
              <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
          </dependencies>
          <scenes>
              <!--Stack In Scroll View Controller-->
              <scene sceneID="85i-FA-G1W">
                  <objects>
                      <viewController storyboardIdentifier="pageOne" id="v4n-Ck-gNo" customClass="StackInScrollViewController" customModule="XC10SWScratch" customModuleProvider="target" sceneMemberID="viewController">
                          <view key="view" contentMode="scaleToFill" id="meJ-hR-GiR">
                              <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                              <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                              <subviews>
                                  <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="h2O-la-OOI">
                                      <rect key="frame" x="0.0" y="20" width="375" height="647"/>
                                      <subviews>
                                          <navigationBar contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ozf-iG-Ogw">
                                              <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
                                              <items>
                                                  <navigationItem title="Title" id="gMo-gQ-HLZ"/>
                                              </items>
                                          </navigationBar>
                                          <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="FOm-go-etU">
                                              <rect key="frame" x="0.0" y="44" width="375" height="300"/>
                                              <constraints>
                                                  <constraint firstAttribute="height" priority="250" constant="300" id="4A2-93-8hK"/>
                                              </constraints>
                                          </stackView>
                                      </subviews>
                                      <color key="backgroundColor" red="0.46202266219999999" green="0.83828371759999998" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                      <constraints>
                                          <constraint firstAttribute="trailing" secondItem="FOm-go-etU" secondAttribute="trailing" id="2wm-HM-UgW"/>
                                          <constraint firstItem="Ozf-iG-Ogw" firstAttribute="width" secondItem="h2O-la-OOI" secondAttribute="width" id="5m2-MQ-vcg"/>
                                          <constraint firstItem="Ozf-iG-Ogw" firstAttribute="top" secondItem="h2O-la-OOI" secondAttribute="top" id="76R-nE-Vve"/>
                                          <constraint firstAttribute="bottom" secondItem="FOm-go-etU" secondAttribute="bottom" id="ASq-4m-5zD"/>
                                          <constraint firstAttribute="trailing" secondItem="Ozf-iG-Ogw" secondAttribute="trailing" id="GHy-BT-HmJ"/>
                                          <constraint firstItem="FOm-go-etU" firstAttribute="width" secondItem="h2O-la-OOI" secondAttribute="width" id="LcJ-rd-yDs"/>
                                          <constraint firstItem="Ozf-iG-Ogw" firstAttribute="leading" secondItem="h2O-la-OOI" secondAttribute="leading" id="VCw-iY-MfZ"/>
                                          <constraint firstItem="FOm-go-etU" firstAttribute="top" secondItem="Ozf-iG-Ogw" secondAttribute="bottom" id="l3k-Nm-hTu"/>
                                          <constraint firstItem="FOm-go-etU" firstAttribute="leading" secondItem="h2O-la-OOI" secondAttribute="leading" id="r3A-iy-6bu"/>
                                      </constraints>
                                  </scrollView>
                              </subviews>
                              <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                              <constraints>
                                  <constraint firstItem="h2O-la-OOI" firstAttribute="leading" secondItem="k8i-v0-f9m" secondAttribute="leading" id="0YL-7I-Lst"/>
                                  <constraint firstItem="h2O-la-OOI" firstAttribute="top" secondItem="k8i-v0-f9m" secondAttribute="top" id="4Zo-wX-Rir"/>
                                  <constraint firstItem="k8i-v0-f9m" firstAttribute="bottom" secondItem="h2O-la-OOI" secondAttribute="bottom" id="FUr-4Z-b6w"/>
                                  <constraint firstItem="k8i-v0-f9m" firstAttribute="trailing" secondItem="h2O-la-OOI" secondAttribute="trailing" id="Ic8-zA-xpZ"/>
                              </constraints>
                              <viewLayoutGuide key="safeArea" id="k8i-v0-f9m"/>
                          </view>
                          <connections>
                              <outlet property="theStackView" destination="FOm-go-etU" id="72X-V9-Lzg"/>
                          </connections>
                      </viewController>
                      <placeholder placeholderIdentifier="IBFirstResponder" id="Ora-A0-Q75" userLabel="First Responder" sceneMemberID="firstResponder"/>
                  </objects>
                  <point key="canvasLocation" x="-327" y="165"/>
              </scene>
          </scenes>
      </document>
      
      
      
      你能发布故事板的屏幕截图吗?这个想法是让scrollview可以使用某种高度。现在,不管堆栈视图是否是动态的,因为当堆栈视图的高度动态增加时,scrollview的内容大小也会动态增加。因此,请确保您为scrollview提供了计算内容大小的工具。比如stackview内部至少应该有某种高度的东西。我希望你明白我的意思。另外,关于你的问题的更多信息将有助于解决它。在这之后,还有什么可以通过编程来完成的吗?因为在执行这些建议的设置后,滚动视图不会滚动。您是否添加了足够多的排列子视图以超过屏幕高度?@learner-将您的文档大纲与我添加到答案中的图像进行比较。是的。我有完全相同的轮廓和滚动视图不滚动。我不确定这里会出什么问题。我也尝试了你的两个建议。它也有同样的问题