【问题标题】:Interpolating gradient colors (as with NSGradient) on iOS?在 iOS 上插入渐变颜色(与 NSGradient 一样)?
【发布时间】:2013-12-02 07:45:27
【问题描述】:

AppKit 在 iOS 中不可用,所以我正在寻找替代品。

具体来说,我正在寻找一种替代方法:

- (NSColor *)interpolatedColorAtLocation: (CGFloat)location

我需要一种方法来定义渐变,并根据输入位置 (float) 查找颜色值。

【问题讨论】:

    标签: ios objective-c gradient appkit nsgradient


    【解决方案1】:

    如果你真的需要一个渐变对象(用于绘制渐变?),你可以使用CG级别的CGGradient"class"。

    至于在渐变中的特定位置插入颜色,您只需要知道两种周围颜色(相对于您的给定位置)和它们之间的插值(t 将是0.0..1.0 之间的位置相对于两种颜色,而不是整个渐变):

    - (UIColor *)colorByInterpolatingWith:(UIColor *)color factor:(CGFloat)factor {
        factor = MIN(MAX(t, 0.0), 1.0);
    
        const CGFloat *startComponent = CGColorGetComponents(self.CGColor);
        const CGFloat *endComponent = CGColorGetComponents(color.CGColor);
    
        float startAlpha = CGColorGetAlpha(self.CGColor);
        float endAlpha = CGColorGetAlpha(color.CGColor);
    
        float r = startComponent[0] + (endComponent[0] - startComponent[0]) * factor;
        float g = startComponent[1] + (endComponent[1] - startComponent[1]) * factor;
        float b = startComponent[2] + (endComponent[2] - startComponent[2]) * factor;
        float a = startAlpha + (endAlpha - startAlpha) * factor;
    
        return [UIColor colorWithRed:r green:g blue:b alpha:a];
    }
    

    使用示例:

    UIColor *purpleColor = [[UIColor redColor] colorByInterpolatingWith:[UIColor blueColor] factor:0.5];
    

    【讨论】:

    【解决方案2】:

    Swift 版本 (macOS)

    这种颜色插值可以用简单的线条来实现:

    let color = NSColor.green.interpolate(.blue, 0.5)

    将此扩展添加到您的项目中:

       extension NSColor{
        /**
         * Interpolates between two NSColors
         * EXAMPLE: NSColor.green.interpolate(.blue, 0.5)
         * NOTE: There is also a native alternative: NSColor.green.blended(withFraction: 0.5, of: .blue)
         */
        func interpolate(_ to:NSColor,_ scalar:CGFloat)->NSColor{
            func interpolate(_ start:CGFloat,_ end:CGFloat,_ scalar:CGFloat)->CGFloat{
                return start + (end - start) * scalar
            }
            let fromRGBColor:NSColor = self.usingColorSpace(.genericRGB)!
            let toRGBColor:NSColor = to.usingColorSpace(.genericRGB)!
            let red:CGFloat = interpolate(fromRGBColor.redComponent, toRGBColor.redComponent,scalar)
            let green:CGFloat = interpolate(fromRGBColor.greenComponent, toRGBColor.greenComponent,scalar)
            let blue:CGFloat = interpolate(fromRGBColor.blueComponent, toRGBColor.blueComponent,scalar)
            let alpha:CGFloat = interpolate(fromRGBColor.alphaComponent, toRGBColor.alphaComponent,scalar)
            return NSColor.init(red: red, green: green, blue: blue, alpha: alpha)
        }
    }
    

    下面的动画是通过这个扩展和AnimLib实现的

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多