Вручную рисовать градиент в приложениях iPhone?

Если у меня есть два UIColors, какой лучший способ сделать четный градиент между ними над областью произвольного размера?

Я предполагаю, что вы создадите подкласс UIView и используете методы рисования CG в методе drawRect. Я просто не знаю, какие из них, или если есть какие-то подводные камни, за которыми следует следить, например, производительность. Кто-нибудь сделал это?

Ответ 2

#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

Быстрый способ добавления градиента:

    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, настоятельно рекомендуется.

Ответ 5

Для представлений, которые рисуют текст, например UILabel, UITextView и UITextField, вы должны добавить градиент внутри функции drawRect. (см. этот пост для примера).

Есть несколько отличных подклассов UILabel, UITextView и UITextField, которые позволяют легко добавить градиент (см. JBGradient on GitHub).

Ответ 6

Решение Same-ish как @Anton Chikin, но немного более надежное. Обратите внимание на переопределение 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, используйте другой инициализатор.

Ответ 7

hi вы можете использовать следующее для применения градиента в представлении

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