在Swift中,您如何使用Velocity targetContentOffset方法编写scrollViewWillEndDragging?

Aub*_*rey 5 xcode objective-c scrollview uicollectionview swift

怎么会在Swift中写这个?

更新:发布我正在尝试转换的方法,最初发布了一个不同于我试图隐藏的方法

这适用于Objective C,但不适用于Swift.我得到的转换错误,当我尝试使用ceilf,并floorfCGFloat.

    - (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];


}
Run Code Online (Sandbox Code Playgroud)

val*_*ine 12

也许以后的派对,但如果处理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)
}
Run Code Online (Sandbox Code Playgroud)


Aub*_*rey 8

回答Christian:我能够在Swift中重写它.我把所有东西都设置成Float数学然后转换CGFloat成基督徒提到的可能.他的回答在技术上是正确的,但是向我展示了一个更新的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)
 }
Run Code Online (Sandbox Code Playgroud)