在 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 中按下时的中心元素的主要内容,如果未能解决你的问题,请参考以下文章