ios - 将可滚动按钮添加到 ScrollView

标签 ios swift scrollview

我想在 ScrollView 中滚动五个按钮。当用户停止拖动按钮时,它应该移动到下一个按钮。我在这里做错了什么?

class ViewController: UIViewController {

    @IBOutlet weak var categoryScrollView: UIScrollView!
    var categoryArr = ["Jack","Mark","Down","Bill","Steve"]

    override func viewDidLoad() {
        super.viewDidLoad()
        let scrollingView = colorButtonsView(CGSizeMake(150,categoryScrollView.frame.size.height), buttonCount: 5)
        categoryScrollView.contentSize = scrollingView.frame.size
        categoryScrollView.addSubview(scrollingView)
        categoryScrollView.showsVerticalScrollIndicator = false
        categoryScrollView.delegate = self
        categoryScrollView.pagingEnabled = true
        categoryScrollView.indicatorStyle = .Default
    }


func colorButtonsView(buttonSize:CGSize, buttonCount:Int) -> UIView {
        let buttonView = UIView()
        buttonView.frame.origin = CGPointMake(0,0)
        let padding = CGSizeMake(10, 10)
        buttonView.frame.size.width = (buttonSize.width + padding.width) * CGFloat(buttonCount)
        var buttonPosition = CGPointMake(padding.width * 0.5, padding.height)
        let buttonIncrement = buttonSize.width + padding.width
        for i in 0...(buttonCount - 1)  {
            var button = UIButton.buttonWithType(.Custom) as! UIButton
            button.frame.size = buttonSize
            button.frame.origin = buttonPosition
            buttonPosition.x = buttonPosition.x + buttonIncrement
            button.setTitle(categoryArr[i], forState: UIControlState.Normal)
            buttonView.addSubview(button)
        }
        return buttonView
    }
}
extension ViewController:UIScrollViewDelegate{
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {

        let index = round(scrollView.contentOffset.x / scrollView.frame.size.width)
        print(index)
    }
}

ScrollView 滚动得很好......但只有两次。它不会滚动到下一个按钮。我该怎么办?

最佳答案

func setContentOffset(scrollView: UIScrollView) {
    
    let numOfItems = itemCount  // 5
    let stopOver = scrollView.contentSize.width / CGFloat(numOfItems)
    let x = round(scrollView.contentOffset.x / stopOver) * stopOver
    
    guard x >= 0 && x <= scrollView.contentSize.width - scrollView.frame.width else {
        return
    }
    
    scrollView.setContentOffset(CGPointMake(x, scrollView.contentOffset.y), animated: true)
}

extension ViewController: UIScrollViewDelegate {

    func scrollViewWillBeginDecelerating(scrollView: UIScrollView) {
    
        setContentOffset(scrollView)
    }

    func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    
        guard !decelerate else {
            return
        }
    
        setContentOffset(scrollView)
    }
}

还在Github做了一个demo项目
https://github.com/rishi420/ScrollViewCustomPaging


更新:

尝试考虑用户结束拖动时的滚动速度。

var velocityX = CGFloat(0.0) 

.

func setContentOffset(scrollView: UIScrollView) {
    
    let numOfItems = itemCount
    let stopOver = scrollView.contentSize.width / CGFloat(numOfItems)
    var x = round((scrollView.contentOffset.x + (velocityX * 150)) / stopOver) * stopOver // 150 is for test. Change it for your liking
    
    x = max(0, min(x, scrollView.contentSize.width - scrollView.frame.width))
    
    scrollView.setContentOffset(CGPointMake(x, scrollView.contentOffset.y), animated: true)
}

.

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
{
    velocityX = velocity.x
}

关于ios - 将可滚动按钮添加到 ScrollView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068838/

相关文章:

android - 我可以有一个有很多 relativeLayouts 的 scrollView

android - Google翻译手机应用程序是否使用Tesseract在本地进行OCR?

ios - 如何创建像苹果新闻应用程序一样的导航过渡?

ios - 呈现和关闭最后一个 UIViewController

Android:带有圆角的 ScrollView。 child 视野在角落流血

android - 无法在可滚动相对布局内滚动 TextView

ios - 队列优先级似乎不对

ios - 调用中的无关参数标签 'localeID' (SwiftDate)

ios - 如何根据实现该协议(protocol)的两个实例的身份为协议(protocol)实现 Equatable 协议(protocol)?

ios - 如何在 SpriteKit 的不同设备上使 SKSpriteNode 的速度相同?