Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.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 UIScrollView框架是通过改变模拟器设备来改变的_Ios_Swift_Xcode_Uiscrollview_Xcode9 - Fatal编程技术网

Ios UIScrollView框架是通过改变模拟器设备来改变的

Ios UIScrollView框架是通过改变模拟器设备来改变的,ios,swift,xcode,uiscrollview,xcode9,Ios,Swift,Xcode,Uiscrollview,Xcode9,我有一个简单的ViewController,它使用UIScrollView显示图像,UIScrollView具有将其附加到superView(顶部、前导、尾随)的约束,还有一个UIPageControl,它可以在iPhoneX模拟器上正常工作 当我在iPad Pro 9.7“模拟器上运行它时,输出是 将故事板中的视图属性从iPhoneX更改为“iPadPro 9.7”后,效果良好 这是我用来计算scrollviewContentSize和SlideSize的逻辑 override int

我有一个简单的ViewController,它使用UIScrollView显示图像,UIScrollView具有将其附加到superView(顶部、前导、尾随)的约束,还有一个UIPageControl,它可以在iPhoneX模拟器上正常工作

当我在iPad Pro 9.7“模拟器上运行它时,输出是

将故事板中的视图属性从iPhoneX更改为“iPadPro 9.7”后,效果良好

这是我用来计算scrollviewContentSize和SlideSize的逻辑

 override internal func viewDidLoad() {
    super.viewDidLoad()
    tutorialScrollView.delegate = self
    viewModel = TutorialViewModel()
    configurePages()
    setupSlideScrollView(slides: slides)
    configurePageControl()
}

private func configurePages() {
    if let viewModel = viewModel {
        createSlides(tutotialPages: viewModel.getTutorialPages())
    }
}

private func createSlides(tutotialPages: [TutorialPage]) {
    for page in tutotialPages {
        if let slide = Bundle.main.loadNibNamed(BUNDLE_ID, owner: self, options: nil)?.first as?  TutorialSlideView {
            slide.configure(title: page.title, detail: page.details, image: page.image)
            slides.append(slide)
        }
    }
}

private func setupSlideScrollView(slides: [TutorialSlideView]) {
    tutorialScrollView.contentSize = CGSize(width: view.frame.width * (CGFloat(slides.count)), height: tutorialScrollView.frame.height)
    tutorialScrollView.isPagingEnabled = true
    for i in 0 ..< slides.count {
        slides[i].frame = CGRect(x: view.frame.width * CGFloat(i), y: 0, width: view.frame.width, height: tutorialScrollView.frame.height)
        tutorialScrollView.addSubview(slides[i])
    }
}
重写内部函数viewDidLoad(){
super.viewDidLoad()
tutorialScrollView.delegate=self
viewModel=TutorialViewModel()
配置页面()
设置幻灯片滚动视图(幻灯片:幻灯片)
configurePageControl()
}
专用函数配置页(){
如果让viewModel=viewModel{
创建幻灯片(TutotialPage:viewModel.GetTutorialPage())
}
}
私有函数创建幻灯片(TutorialPage:[TutorialPage]){
对于TutotalPage中的页面{
如果let slide=Bundle.main.loadNibNamed(Bundle\u ID,所有者:self,选项:nil){
幻灯片.配置(标题:page.title,详细信息:page.details,图像:page.image)
幻灯片。附加(幻灯片)
}
}
}
专用函数设置幻灯片滚动视图(幻灯片:[教程幻灯片视图]){
tutorialcrollview.contentSize=CGSize(宽度:view.frame.width*(CGFloat(slides.count)),高度:tutorialcrollview.frame.height)
tutorialScrollView.isPaginEnabled=true
对于0中的i..

有人能找到问题吗?

您是否尝试在setupSlideScrollView方法中打印视图的框架以确保其正确性?如果使用AutoLayout,则不能保证viewDidLoad方法中的设置正确。有时会,有时不会。我假设在这个特殊的例子中,它在iPhoneX上是正确的,但在iPad上是错误的


如果这是问题所在,您应该在viewDidLayoutSubviews中设置contentSize和幻灯片的框架。将幻灯片添加为子视图应保留在viewDidLoad/setupSlideScrollView中,因为viewDidLayoutSubviews通常会被多次调用。

在viewDidLayoutSubviews()中计算幻灯片框架完成了这项工作,谢谢!