通过更改模拟器设备更改 UIScrollView 框架
UIScrollView frame is changed by changing Simulator device
我有一个简单的 ViewController,它使用 UIScrollView 显示图像,它具有将它附加到 superView 的(顶部、前导、尾随)的约束,以及一个 UIPageControl,它在 iPhoneX 模拟器上工作正常
当我在 iPad Pro 9.7" 模拟器上 运行 它时,输出是
将故事板中的 View as 属性从 iPhoneX 更改为 iPadPro 9.7" 后效果很好
这是我用来计算scrollviewContentSize & slidesSize
的逻辑
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])
}
}
谁能找到问题所在?
您是否尝试在 setupSlideScrollView 方法中打印视图的框架以确保它是正确的?如果您使用 AutoLayout,则不能保证它在 viewDidLoad 方法中是正确的。有时会,有时不会。我假设在这种特殊情况下,它恰好在 iPhone X 上是正确的,但在 iPad.
上不正确
如果这是问题所在,您应该在 viewDidLayoutSubviews 中设置 contentSize 和幻灯片的框架。添加幻灯片作为子视图应该保留在 viewDidLoad/setupSlideScrollView 中,因为 viewDidLayoutSubviews 通常会被多次调用。
我有一个简单的 ViewController,它使用 UIScrollView 显示图像,它具有将它附加到 superView 的(顶部、前导、尾随)的约束,以及一个 UIPageControl,它在 iPhoneX 模拟器上工作正常
当我在 iPad Pro 9.7" 模拟器上 运行 它时,输出是
将故事板中的 View as 属性从 iPhoneX 更改为 iPadPro 9.7" 后效果很好
这是我用来计算scrollviewContentSize & slidesSize
的逻辑 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])
}
}
谁能找到问题所在?
您是否尝试在 setupSlideScrollView 方法中打印视图的框架以确保它是正确的?如果您使用 AutoLayout,则不能保证它在 viewDidLoad 方法中是正确的。有时会,有时不会。我假设在这种特殊情况下,它恰好在 iPhone X 上是正确的,但在 iPad.
上不正确如果这是问题所在,您应该在 viewDidLayoutSubviews 中设置 contentSize 和幻灯片的框架。添加幻灯片作为子视图应该保留在 viewDidLoad/setupSlideScrollView 中,因为 viewDidLayoutSubviews 通常会被多次调用。