代码之家  ›  专栏  ›  技术社区  ›  Mike McMaster

在iPhone应用程序中手动绘制渐变?

  •  11
  • Mike McMaster  · 技术社区  · 16 年前

    如果我有两种ui颜色,在任意大小的区域上,在它们之间绘制均匀渐变的最佳方法是什么?

    我猜您应该创建一个uiview子类,并在drawrect方法中使用cg绘图方法。我只是不知道哪一个,或者是否有什么陷阱需要注意,比如性能。有人这样做吗?

    7 回复  |  直到 16 年前
        1
  •  20
  •   the Tin Man    13 年前

    你需要使用cgGradient。参见iPhone开发中心“ CGGradient Reference “文件。

        2
  •  50
  •   Anton Chikin    11 年前
    #import <QuartzCore/QuartzCore.h>    
    - (void) setGradient {
        CAGradientLayer *gradient = [CAGradientLayer layer];
        gradient.frame = self.view.bounds;
        gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];
        [self.view.layer insertSublayer:gradient atIndex:0];     
    }
    

    不要忘记将Quartzcore库添加到您的项目中。

        3
  •  3
  •   Reza_Rg    9 年前

    快速添加渐变的方法是:

        var view : UIView = UIView(frame: CGRectMake(0, 0, 320, 100))
        var g : CAGradientLayer = CAGradientLayer()
        g.frame = gradientView.bounds
        g.colors = ["000000".UIColor.CGColor , "111111".UIColor.CGColor]
        view.layer.insertSublayer(g, atIndex: 0)
    

    UIColor() 是Swift要转换的帮助程序类 hex color rgb color ,强烈推荐。

        4
  •  0
  •   tybro0103    10 年前

    与@anton chikin的ISH解决方案相同,但更为强大。注意覆盖 layerClass …这样,您不必担心设置框架,框架会在旋转和调整大小时自动更新。

    class GradientView: UIView {
    
        var colorA : UIColor = UIColor.greenColor() {
            didSet { updateGradient() }
        }
        var colorB : UIColor = UIColor.blueColor() {
            didSet { updateGradient() }
        }
    
        override class func layerClass() -> AnyClass {
            return CAGradientLayer.self
        }
    
        required init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            updateGradient()
        }
    
        func updateGradient() {
            if let gLayer = layer as? CAGradientLayer {
                gLayer.colors = [colorA.CGColor, colorB.CGColor]
            }
        }
    
    }
    

    如果您使用的是ib,那么可以通过“用户定义的运行时属性”来设置属性。

    如果不使用ib,请使用其他初始值设定项。

        5
  •  0
  •   Community Mr_and_Mrs_D    7 年前

    我发现使用cagradientlayer会产生明显的梯度 最后用了这个

    http://evilrockhopper.com/tag/cggradient/

    根据这个问题 Gradients on UIView and UILabels On iPhone

        6
  •  0
  •   Amit Shelgaonkar    9 年前

    嗨,您可以使用下面的内容在视图上应用渐变

    -(void)applyGradientEffecttoView:(UIView *)aView
     {
         // Create the colors
    
         UIColor *darkOp = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0];
         UIColor *lightOp =[UIColor colorWithRed:255.0f green:255.0f blue:255.0f alpha:0.0];
    
          // Create the gradient
          CAGradientLayer *gradient = [CAGradientLayer layer];
    
          // Set colors
          gradient.colors = [NSArray arrayWithObjects:
                            (id)lightOp.CGColor,
                            (id)darkOp.CGColor,
                            nil];
         gradient.locations = [NSArray arrayWithObjects:
                              [NSNumber numberWithFloat:0.0f],
                              [NSNumber numberWithFloat:0.5],
                              nil];
    
        // Set bounds
         gradient.frame = aView.bounds;
    
       // Add the gradient to the view
    
      [aView.layer insertSublayer:gradient atIndex:0];
    }
    
        7
  •  0
  •   Community Mr_and_Mrs_D    7 年前

    用于绘制文本的视图,例如 UILabel , UITextView UITextField ,您应该在 drawRect 功能。(见此 post 例如)。

    有一些很大的亚类 乌拉贝尔 , UITExtVIEW 输入框 这使您可以很容易地添加渐变(请参见 JBGradient on GitHub )