在 ScrollView 中按下时的中心元素

Posted

技术标签:

【中文标题】在 ScrollView 中按下时的中心元素【英文标题】:center element when pressed in a ScrollView 【发布时间】:2016-04-26 12:53:22 【问题描述】:

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

我有一个 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)

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

示例:

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

按钮 5 移动到中心。

【问题讨论】:

您想移动滚动视图的 origin.x 吗?为什么?这会将您的滚动视图从视图控制器的一侧移开。 我建议您编辑您的问题以提高清晰度,因为我无法理解您想从这个问题中得到什么。 添加一个例子,我希望它会更明确 如果你得到按钮索引,如果你点击你会得到索引 5 将索引减少 2 即 3 获取该索引中的按钮并将滚动视图的内容偏移设置为该按钮的原点 【参考方案1】:

现在我建议使用滚动视图方法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)

我的数学可能有点偏离,但本质是您使用滚动视图和 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)


如果根据您的项目进行适当调整,这应该可以让您按照您的概述进行操作。

【讨论】:

你所做的事情的逻辑很简单。感谢分享本杰明!【参考方案2】:

希望这会对你有所帮助。

在按钮操作方法中编写以下代码。

func buttonClicked(sender:UIButton) 

        for view in self.scrollView.subviews 

            if view.isKindOfClass(UIButton) && view.tag == sender.tag  

                let xCenter = max(0, (view.center.x - self.scrollView.frame.width/2))

                self.scrollView.setContentOffset(CGPointMake(xCenter, self.scrollView.contentOffset.y), animated: true)
                break;
            
       

【讨论】:

【参考方案3】:

我想你想让被触摸的按钮放在中心,所以有一个简单的解决方案,你可以使用按钮的 center.x - scrollview.width / 2 作为 offsetX 来构造 contentOffset 并采取两个边界情况考虑:offsetx scroll.contentSize.width

【讨论】:

【参考方案4】:

好的,我自己发现的。

let centerScrollView = scrollView.frame.size.height * 2

UIView.animateWithDuration(0.2, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: 
        self.scrollView.contentOffset = CGPoint(x: sender.frame.origin.x - centerScrollView, y: sender.frame.origin.y)
        , completion: nil)

它是完美的中心。谢谢大家。

【讨论】:

以上是关于在 ScrollView 中按下时的中心元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 TouchableHighlight 在 React Native 中按下时如何更改按钮颜色?

UI在android studio中按下时闪烁

如何在nib文件中按下时禁用UIButton高亮显示?

js面向对象开发之--元素拖拽

在键盘中按下下一个按钮时移动到最近的edittext元素

如何在 SwiftUI 中为按下时的导航链接设置动画?