在Swift中,你会如何编写scrollViewWillEndDragging withVelocity targetContentOffset 方法?
In Swift, how would you write the scrollViewWillEndDragging withVelocity targetContentOffset method?
Swift怎么写?
更新:发布了我试图转换的方法,最初发布了一个不同的方法,这不是我试图隐藏的方法
这适用于 Objective C,但不适用于 Swift。当我尝试将 ceilf
和 floorf
与 CGFloat
.
一起使用时出现转换错误
- (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];
}
您可以使用 ceil
或 floor
。 Apple 现在允许 CGFloat
作为这些常用函数的参数。例如:
func ceil(x: CGFloat) -> CGFloat
所以在你的例子中:
ceil(currentOffset/pageWidth)
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)
}
好吧,这对我不起作用,我有一个折衷的方法,使用 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
}
}
也许晚些时候参加聚会,但是如果处理 iOS11 + Swift4,恕我直言,none 提议的解决方案是可行的解决方案。
下面有一个更适合问题的答案,完全使用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)
}
Swift怎么写?
更新:发布了我试图转换的方法,最初发布了一个不同的方法,这不是我试图隐藏的方法
这适用于 Objective C,但不适用于 Swift。当我尝试将 ceilf
和 floorf
与 CGFloat
.
- (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];
}
您可以使用 ceil
或 floor
。 Apple 现在允许 CGFloat
作为这些常用函数的参数。例如:
func ceil(x: CGFloat) -> CGFloat
所以在你的例子中:
ceil(currentOffset/pageWidth)
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)
}
好吧,这对我不起作用,我有一个折衷的方法,使用 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
}
}
也许晚些时候参加聚会,但是如果处理 iOS11 + Swift4,恕我直言,none 提议的解决方案是可行的解决方案。
下面有一个更适合问题的答案,完全使用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)
}