将视图控制器主视图(self.View)子视图移动到滚动视图


  1. 我有一个视图控制器与子视图&应用的约束
  2. 问题:我正在尝试以编程方式为添加滚动视图只有iPhone 4s设备在滚动视图中具有self.view的所有子视图
  3. 滚动视图应该包含self.view的所有子视图(我使用self.view.subviews添加(

    1. 我试过的代码

    如果设备类型.IS_IPHONE_4_OR_ESS{

        //Add Scrollview to self.view
        let scrollview : UIScrollView = UIScrollView(frame: CGRectMake(0,0,320,480))
        scrollview.showsVerticalScrollIndicator = true;
        scrollview.scrollEnabled = true;
        scrollview.userInteractionEnabled = true;
       // scrollview.addSubview(self.view) /
        let total : NSArray = (self.view.subviews as NSArray).copy() as! NSArray
        //Add elements to scrollview but subviewes don't get scroll
        for subview in total
        {
            scrollview.addSubview(subview as! UIView)
        }
        /// Results in blank white screen. Reason: May be scrollview & self.view pointing to same objects
        for subview in self.view.subviews {
            subview.removeFromSuperview()
        }
       self.view.addSubview(scrollview)
        scrollview.contentSize = CGSizeMake(self.view.bounds.size.width,  self.view.bounds.size.height+200)
        }
    
  4. 我知道大小类&给问题可以解决。

  5. 我也知道在故事板中添加滚动视图&除了iPhone4s之外的所有设备都可以隐藏

仔细查看您的代码,我想我看到了一些问题,这些问题导致您的期望值无法得到满足。

let total : NSArray = (self.view.subviews as NSArray).copy() as! NSArray

这不会为subviews数组中的每个视图创建一个副本,它只会复制该数组,该数组的元素与源数组指向的元素相同。要复制每个元素,您应该执行以下操作:

let total = self.view.subviews.map { $0.copy() }

在代码中,当您将所有这些视图添加到新的超级视图时,它们会自动从以前的超级视图中删除。因此,现在在对每个元素调用subview.removeFromSuperview()的循环中,您将从刚刚添加的新超级视图中删除每个元素,这将导致出现一个空白的白色屏幕。

所以,如果是我,我不会复制所有的子视图,然后将每个子视图添加到一个新的超视图中,因为我知道它们将从以前的超视图删除。然后您就不必迭代并删除旧的。

最新更新