Рисование градиента вручную в приложениях для iPhone? - PullRequest
11 голосов
/ 22 октября 2008

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

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

Ответы [ 7 ]

50 голосов
/ 08 марта 2013
#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 в ваш проект.

20 голосов
/ 22 октября 2008

Вы хотите использовать CGGradient. См. IPhone Dev Center " CGGradient Reference " документ.

3 голосов
/ 25 января 2015

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

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

0 голосов
/ 06 октября 2015

Привет, вы можете использовать следующие, чтобы применить градиент на виде

-(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];
}
0 голосов
/ 01 декабря 2014

То же самое решение, что и у @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, используйте другой инициализатор.

0 голосов
/ 26 июня 2014

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

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

0 голосов
/ 21 марта 2013

Я обнаружил, что использование CAGradientLayer создает градиент с заметным шагом Закончилось использованием этого

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

По этому вопросу Градиенты на UIView и UILabels на iPhone

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...