在Swift中,你会如何编写scrollViewWillEndDragging withVelocity targetContentOffset方法?

5

如何用Swift编写这个方法?

更新: 我发布了我正在尝试转换的方法,最初发布了一个不是我想要转换的方法

这个方法在Objective C中可以工作,但在Swift中无法使用。当我尝试将ceilffloorfCGFloat一起使用时,会出现转换错误。

    - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{

    float pageWidth = 200 + 30; // width + space

    float currentOffset = scrollView.contentOffset.x;
    float targetOffset = targetContentOffset->x;
    float newTargetOffset = 0;

    if (targetOffset > currentOffset)
        newTargetOffset = ceilf(currentOffset / pageWidth) * pageWidth;
    else
        newTargetOffset = floorf(currentOffset / pageWidth) * pageWidth;

    if (newTargetOffset < 0)
        newTargetOffset = 0;
    else if (newTargetOffset > scrollView.contentSize.width)
        newTargetOffset = scrollView.contentSize.width;

    targetContentOffset->x = currentOffset;
    [scrollView setContentOffset:CGPointMake(newTargetOffset, 0) animated:YES];


}
4个回答

19

在我看来,或许派对稍后再说吧,但对于处理iOS11 + Swift4,没有任何一个提出的解决方案是可行的解决方案。

以下是一个更适合这个问题的答案,完全可以与Swift 4.1兼容:

override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    let pageWidht:CGFloat = 200.0 + 30.0
    let currentOffset = scrollView.contentOffset.x
    let targetOffset = CGFloat(targetContentOffset.pointee.x)
    var newTargetOffset:CGFloat = 0.0

    if targetOffset > currentOffset {
        newTargetOffset = CGFloat(ceilf(Float((currentOffset / pageWidht) * pageWidht)))
    }
    else {
        newTargetOffset = CGFloat(floorf(Float((currentOffset / pageWidht) * pageWidht)))
    }

    if newTargetOffset < 0.0 {
        newTargetOffset = 0.0
    }
    else if newTargetOffset > scrollView.contentSize.width {
        newTargetOffset = scrollView.contentSize.width
    }
    targetContentOffset.pointee = CGPoint(x: newTargetOffset, y: 0.0)
}

谢谢您的回答!我正在尝试增加滚动到新的targetContentOffset时的速度(例如,更快地滑出),有什么想法可以实现这种效果吗? - temp
对我来说,“指针”比“内存”更准确。 - Kutay Demireren

9
回答 Christian 的问题:我能够使用 Swift 重写这个代码。我将所有东西都设置为 Float 来进行计算,然后转换为 CGFloat,就像 Christian 提到的那样是可能的。他的答案在技术上是正确的,但展示给一个较新的 iOS 开发者如何用 Swift 写这段代码是我想要的。
func scrollViewWillEndDragging(scrollView: UIScrollView!, withVelocity velocity: CGPoint, targetContentOffset: UnsafePointer<CGPoint>) {

     var pageWidth = Float(200 + 30)
     var currentOffset = Float(scrollView.contentOffset.x)
     var targetOffset = Float(targetContentOffset.memory.x)
     var newTargetOffset = Float(0)
     var scrollViewWidth = Float(scrollView.contentSize.width)

     if targetOffset > currentOffset {
         newTargetOffset = ceilf(currentOffset / pageWidth) * pageWidth
     } else {
         newTargetOffset = floorf(currentOffset / pageWidth) * pageWidth
     }

     if newTargetOffset < 0 {
         newTargetOffset = 0
     } else if newTargetOffset > currentOffset {
         newTargetOffset = currentOffset
     }

     Float(targetContentOffset.memory.x) == currentOffset

     scrollView.setContentOffset(CGPointMake(CGFloat(newTargetOffset), 0), animated: true)
 }

1

你可以使用ceilfloor。苹果现在允许在这些常用函数中使用CGFloat作为参数。例如:

func ceil(x: CGFloat) -> CGFloat

所以在你的例子中:
ceil(currentOffset/pageWidth)

抱歉,我复制了错误的方法,你能看一下吗(这里没有X)。 - Aubrey
1
是的,它不必包含x。你可以这样使用它:ceil(currentOffset/pageWidth) - Christian
所以这是有效的,但在我尝试使用targetoffset分配当前偏移量时会抛出有关init的错误 请参见这里:http://d.pr/i/18fCP - Aubrey

1

好的,这对我不起作用,我找到了一个妥协的方法,使用 scrollViewDidEndDecelerating

    var targetOffSet:CGPoint?
    func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        var offsetX:CGFloat = targetContentOffset.memory.x
        offsetX -= someValue
        self.targetOffSet = CGPoint(x: offsetX, y: 0)
}
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    if self.targetOffSet != nil {
        scrollView.setContentOffset(self.targetOffSet!, animated: true)
        self.targetOffSet = nil
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接