Ответ 1
Вы хотите использовать CGGradient. См. Раздел "Центр разработчиков iPhone" Документ CGGradient Reference.
Если у меня есть два UIColors, какой лучший способ сделать четный градиент между ними над областью произвольного размера?
Я предполагаю, что вы создадите подкласс UIView и используете методы рисования CG в методе drawRect. Я просто не знаю, какие из них, или если есть какие-то подводные камни, за которыми следует следить, например, производительность. Кто-нибудь сделал это?
Вы хотите использовать CGGradient. См. Раздел "Центр разработчиков iPhone" Документ CGGradient Reference.
#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.
Быстрый способ добавления градиента:
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
, настоятельно рекомендуется.
Я обнаружил, что использование CAGradientLayer дает градиент с заметным степпингом Закончилось использование этого
В соответствии с этим вопросом Градиенты на UIView и UILabels на iPhone
Для представлений, которые рисуют текст, например UILabel
, UITextView
и UITextField
, вы должны добавить градиент внутри функции drawRect
. (см. этот пост для примера).
Есть несколько отличных подклассов UILabel
, UITextView
и UITextField
, которые позволяют легко добавить градиент (см. JBGradient on GitHub).
Решение 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, используйте другой инициализатор.
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];
}