【问题标题】:Why is Page Control not reflecting where I am on the UIScrollView?为什么页面控件没有反映我在 UIScrollView 上的位置?
【发布时间】:2019-08-13 20:41:03
【问题描述】:

编辑我的 UIScrollView 大小后,页面控件停止工作。

您可以看到只有 3 张幻灯片。但是 (1) 页面控制没有反映我在哪张幻灯片上,(2) 我只能从幻灯片 1 滚动到幻灯片 3。

这是我的代码:

func setupSlideScrollView(slides : [Slide]) {
    scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 154)
    scrollView.contentSize = CGSize(width: 188 * CGFloat(slides.count) + CGFloat((slides.count - 1) * 10), height: 153)
    scrollView.isPagingEnabled = true

    var lastCellMaxX: CGFloat = 0
    let constantSpacingBetweenCell: CGFloat = 10

    for i in 0 ..< slides.count {
        slides[i].frame = CGRect(x: lastCellMaxX, y: 0, width: 220, height: 153)
        scrollView.addSubview(slides[i])
        lastCellMaxX += 188 + constantSpacingBetweenCell
    }
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let pageIndex = round(scrollView.contentOffset.x/scrollView.frame.size.width)
    pageControl.currentPage = Int(pageIndex)
}

【问题讨论】:

  • 您没有显示足够的代码。何时调用setupSlideScrollView?它有很大的不同。此外,您的“魔术数字”(154、188、220、153)是难闻的气味。
  • 1. setupSlideScrollViewviewDidLoad 内。它在我的 API 调用内部调用(我获取天气数据,然后创建幻灯片,全部在 viewDidLoad 内部)。 2. 我确信这些神奇的数字可以改进(我是 Swift 新手)。有什么更好的选择?
  • "setupSlideScrollView is inside of viewDidLoad" 这可能是问题所在,因为此时您的视图还没有真正的frame,所以您的view.frame.width 会给您的滚动视图提供错误的宽度.
  • 谢谢@matt!你是对的,现在 Page 控件反映了更改......但我有一个最后一个错误。当我滚动幻灯片时,它直接从幻灯片 1 转到幻灯片 3。我没有更改我的代码(除了使用下面的 Mocha 解决方案)。那么可能是什么错误?

标签: ios swift xcode uiscrollview


【解决方案1】:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// This will always round down to zero 
// since the contentOffset.x will always be smaller than the frame width...
    let pageIndex = round(scrollView.contentOffset.x/scrollView.frame.size.width) 
// Possible logic to correct this?
    let pageIndex = scrollView.contentOffset.x / (width of a slide)
    pageControl.currentPage = Int(pageIndex)
}

-- 因聊天而更新--

您的滚动视图的框架很好。但是,您需要添加一个 stackview 来保存所有幻灯片,以便滚动浏览它。滚动视图有点棘手,因为您不能只添加视图并期望它是可滚动的。

这是我用来创建包含堆栈视图的滚动视图的测试代码。

func createSlideshow() {
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    let slide1 = UIView(frame: CGRect(x: 0, y: 0, width: 220, height: 375))
    slide1.backgroundColor = UIColor.red
    let slide2 = UIView(frame: CGRect(x: 0, y: 0, width: 220, height: 375))
    slide2.backgroundColor = UIColor.blue
    let slide3 = UIView(frame: CGRect(x: 0, y: 0, width: 220, height: 375))
    slide3.backgroundColor = UIColor.yellow
    let slides: [UIView] = [slide1, slide2, slide3]
    let stackView = UIStackView()
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .horizontal
    stackView.alignment = .center
    stackView.distribution = .equalCentering
    stackView.spacing = 10
    for slide in slides {
        stackView.addArrangedSubview(slide)
        slide.widthAnchor.constraint(equalToConstant: slide.frame.width).isActive = true
        slide.heightAnchor.constraint(equalTo: stackView.heightAnchor).isActive = true
    }
    scrollView.addSubview(stackView)
    stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true

    stackView.widthAnchor.constraint(greaterThanOrEqualTo: scrollView.widthAnchor).isActive = true
    stackView.heightAnchor.constraint(equalTo: scrollView.heightAnchor).isActive = true
}

【讨论】:

  • 没用 :/ 但你说的有道理......你认为还有什么问题?
  • 我想知道这个方法中scrollview.contentOffset.x和幻灯片的宽度。
  • 我使用马特的评论和您的解决方案修复了这个错误。谢谢!但是现在我遇到了最后一个错误......当我滚动时,它直接从幻灯片 1 转到幻灯片 3(而不是在幻灯片 2 处停止)。我的代码看起来一样,除了我添加了你的更改。有什么问题?
  • 我不确定.. 当您认为当前幻灯片应为 2 时,scrollview.contentOffset.x 是什么?幻灯片的宽度是多少?整个scrollview.frame.size.width是多少?
  • 我不确定当前幻灯片为 2 时scrollview.contentOffset.x 是什么。但我发现scrollview.frame.size.width 为 375,幻灯片的宽度为 220。我猜我应该把框架放大吗?
猜你喜欢
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2023-03-18
  • 2011-08-04
  • 2021-02-26
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多