ios - 将方法从 Objective-C 转换为 Swift 时的区别

标签 ios objective-c swift icarousel

这是我在 Objective-C 中的方法:

- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform
{
    //items in the center are scaled by this factor
    const CGFloat centerScale = 5.0f;
    //the larger the xFactor, the smaller the magnified area
    const CGFloat xFactor = 0.65f;
    //should the gap also be scaled? or keep it constant.
    const BOOL scaleGap = NO;

    const CGFloat spacing = [self carousel:carousel valueForOption:iCarouselOptionSpacing withDefault:1.025];

    const CGFloat gap = scaleGap?0.0:spacing-1.0;

    //counting x offset to keep a constant gap
    CGFloat scaleOffset = 0.0;
    float x = fabs(offset);
    for(;x >= 0.0; x-=1.0)
    {
        scaleOffset+=[self scaleForX:x xFactor:xFactor centerScale:centerScale];
        scaleOffset+= ((x>=1.0)?gap:x*gap);
    }
    scaleOffset -= [self scaleForX:offset xFactor:xFactor centerScale:centerScale]/2.0;
    scaleOffset += (x+0.5)*[self scaleForX:(x+(x>-0.5?0.0:1.0)) xFactor:xFactor centerScale:centerScale];
    scaleOffset *= offset<0.0?-1.0:1.0;
    scaleOffset *= scaleGap?spacing:1.0;

    CGFloat scale = [self scaleForX:offset xFactor:xFactor centerScale:centerScale];
    transform = CATransform3DTranslate(transform, scaleOffset*carousel.itemWidth, 0.0, 0.0);
    transform = CATransform3DScale(transform, scale, scale, 1.0);
    return transform;
}

它是这样的:

enter image description here

这就是我将其更改为 Swift 的方式:

func carousel(carousel: iCarousel!, itemTransformForOffset offset: CGFloat, baseTransform transform: CATransform3D) -> CATransform3D
{
    let centerScale : CGFloat = 5.0
    let xFactor : CGFloat = 0.65
    let scaleGap : Bool = false
    let spacing : CGFloat = self.carousel(carousel, valueForOption: iCarouselOption.Spacing, withDefault: 1.025)
    let gap : CGFloat = scaleGap ? 0 : spacing - 1.0
    var scaleOffset : CGFloat = 0.0
    var x : CGFloat = fabs(offset)
    for (;x >= 0.0 ; x -= 1.0)
    {
        scaleOffset += NumberScroller.scaleForX(x, xFactor: xFactor, centerScale: centerScale)
        scaleOffset += ((x >= 1.0) ? gap : x * gap)
    }

    scaleOffset -= NumberScroller.scaleForX(offset, xFactor: xFactor, centerScale: centerScale)
    scaleOffset += (x + 0.5) * NumberScroller.scaleForX((x + ( x > -0.5 ? 0.0 : 1.0 )), xFactor: xFactor, centerScale: centerScale)
    scaleOffset *= offset < 0.0 ? -1.0 : 1.0
    scaleOffset *= scaleGap ? spacing : 1.0

    var scale : CGFloat = NumberScroller.scaleForX(offset, xFactor: xFactor, centerScale: centerScale)
    var newTransform : CATransform3D = transform
    newTransform = CATransform3DTranslate(transform, scale, scale, 1.0)
    newTransform = CATransform3DScale(transform, scale, scale, 1.0)
    return newTransform;
}

它是这样的:

enter image description here

最佳答案

检查倒数第三行:

var newTransform = CATransform3DTranslate(transform, scaleOffset * carousel.itemWidth, 0.0, 0.0);

newTransform = CATransform3DScale(newTransform, scale, scale, 1.0)

干杯

关于ios - 将方法从 Objective-C 转换为 Swift 时的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30842107/

相关文章:

iphone - objective-c 中的访问修饰符可见性

objective-c - NSView子View添加到superView后不可见

ios - 如何在 Swift 中使用 Timer(以前称为 NSTimer)?

ios - 以编程方式定义的不同行为 NSLayoutConstraints 与 'greaterThanOrEqual' 的 Storyboard 约束

ios - UIButton 图像在多个 UITableViewCells 中更改

iPhone - 使用 iOS Game Kit 开发游戏

objective-c - 这些构建错误是什么意思?在这种情况下如何更好地进行调试? XCode,PayPal SDK

ios - 修复 : . 中的错误重复符号 _response ...:链接器命令失败,退出代码为 1(使用 -v 查看调用)

ios - 当应用程序在 tvOS 中播放视频期间从后台进入前台时,前进和后退不起作用

swift - 节省字节 Vapor Swift