在 ScrollView 中按下时居中元素

Mak*_*lle 0 iphone uiscrollview ios swift

我真的如何做一件可能很容易的事情..

我有一个带有一些按钮的 ScrollView。这就是我在滚动视图中创建所有按钮的方式。

var buttonList = [UIButton]()

func createButton() {
    let imageArray = fillImageArray()
    var lastButtonWidth: CGFloat = 0


    for index in 0..<6 {
        let frame1 = CGRect(x: ((self.view.frame.size.width / 2) - 27.5) + CGFloat(index * 70), y: 0, width: 55, height: 55 )
        let button = UIButton(frame: frame1)
        button.setImage(imageArray[index], forState: .Normal)
        button.tag = index
        button.addTarget(parentViewController, action: #selector(ViewController.buttonClicked(_:)), forControlEvents: .TouchUpInside)
        self.scrollView.addSubview(button)
        lastButtonWidth = frame1.origin.x
        buttonList.append(button)
    }
    self.scrollView.contentSize = CGSizeMake(lastButtonWidth + 55, 0)
}
Run Code Online (Sandbox Code Playgroud)

我希望当我按下我的一个按钮时,让他居中并正确定位其他按钮。

例子 : 在此处输入图片说明

如果我按 5 我想要这个结果:

在此处输入图片说明

按钮 5 移动到中心。

Ben*_*wry 5

现在我建议使用的是滚动视图方法scrollView.scrollRectToVisible(CGRect, animated: Bool)。这将移动滚动视图以使内容的特定部分可见。

要创建 CGRect,您可以执行以下操作:

let scrollWidth = scrollView.frame.width
let scrollHeight = scrollView.frame.height

let desiredXCoor = button.frame.origin.x - ((scrollWidth / 2) - (button.frame.width / 2) )

let rect = CGRect(x: desiredXCoor, y: 0, width: scrollWidth, height: scrollHeight)

scrollView.scrollRectToVisible(rect, animated: true)
Run Code Online (Sandbox Code Playgroud)

我的数学可能有点偏差,但本质是您使用 scrollView 和 UIButton 的大小为滚动视图创建一个 CGRect 以移动到。这意味着当一个按钮被点击时,你可以使用这样的实现:

func myMethod() {
    button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)

}

func buttonClicked(sender: UIButton){

    let scrollWidth = scrollView.frame.width
    let scrollHeight = scrollView.frame.height

    let desiredXCoor = sender.frame.origin.x - ((scrollWidth / 2) - (sender.frame.width / 2) )

    let rect = CGRect(x: desiredXCoor, y: 0, width: scrollWidth, height: scrollHeight)

    scrollView.scrollRectToVisible(rect, animated: true)

}
Run Code Online (Sandbox Code Playgroud)

如果根据您的项目进行适当调整,这应该允许您执行您所概述的操作。