Есть ли способ сделать цвет фона градиента в построителе интерфейса?
Для моего приложения я использую TableView и используя настраиваемые UITableViewCells.
Я настроил свои ячейки через построитель интерфейса, а не программно. Есть ли способ сделать цвет фона моей настроенной ячейки градиентом в построителе интерфейса?
Спасибо.
Ответы
Ответ 1
Чтобы нарисовать градиент, вам придется подклассировать и переопределить drawRect программно:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents
(colorSpace,
(const CGFloat[8]){1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f},
(const CGFloat[2]){0.0f,1.0f},
2);
CGContextDrawLinearGradient(context,
gradient,
CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMinY(self.bounds)),
CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMaxY(self.bounds)),
0);
CGColorSpaceRelease(colorSpace);
CGContextRestoreGState(context);
}
Самый простой способ, который держит ваши ячейки в построителе интерфейса, вероятно, заключается в подклассе UIView, чтобы он рисовал градиент в своем drawRect и помещал его в свою ячейку за другими областями:
GradientView *gradientView = [[GradientView alloc] init];
gradientView.frame = cell.bounds;
[cell addSubview:gradientView];
[cell sendSubviewToBack:gradientView];
Однако лучший способ сделать это, вероятно, не использовать конструктор интерфейса для этого и сделать подкласс UITableViewCell. Для расширенной настройки разработчики интерфейсов, как правило, усложняют мой опыт. Это до личного предпочтения, хотя.
Ответ 2
Это работает для Swift 3.0:
@IBDesignable final class GradientView: UIView {
@IBInspectable var startColor: UIColor = UIColor.clear
@IBInspectable var endColor: UIColor = UIColor.clear
override func draw(_ rect: CGRect) {
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = CGRect(x: CGFloat(0),
y: CGFloat(0),
width: superview!.frame.size.width,
height: superview!.frame.size.height)
gradient.colors = [startColor.cgColor, endColor.cgColor]
gradient.zposition = -1
layer.addSublayer(gradient)
}
}
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Ответ 3
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = yourView.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id) [[UIColor whiteColor] CGColor], nil];
[yourView.layer insertSublayer:gradient atIndex:0];
Ответ 4
Да, это возможно: Сделайте изображение в градиенте с 1 X Height pix.
Установите для этого значение backgroundColor для ячейки.
cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"gradImage.png"]];
** Вы можете установить цвет градиента с кодом, но его время, затраченное на процесс. Если вы заполните лучше, то найдите это.
Ответ 5
answer by etayluz работает нормально, но я добавил пару изменений:
- Размер градиента, определяемый границами собственного слоя, а не надстройка.
-
Удалите слой Gradient на каждой ничьей, чтобы он не продолжал рисовать и добавлял новый слой, когда требуется перерисовать (например, вызывая .setNeedsDisplay()
при вращении).
@IBDesignable final class MFGradientView: UIView {
@IBInspectable var startColor: UIColor = UIColor.clear
@IBInspectable var endColor: UIColor = UIColor.clear
override func draw(_ rect: CGRect) {
layer.sublayers?.first?.removeFromSuperlayer()
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = CGRect(origin: CGPoint.zero, size: self.bounds.size)
gradient.colors = [startColor.cgColor, endColor.cgColor]
layer.insertSublayer(gradient, at: 0)
}
}
Ответ 6
Я не знаю, есть ли опция градиента, но вы можете добавить UIImageView в пользовательскую ячейку и добавить изображение с градиентом.
Ответ 7
На основе ответа etayluz я немного изменил код, взяв свойство layerClass для UIView, поэтому вам не нужен отдельный слой в качестве подуровня.
Я думаю, что он намного чище, и он также работает с живыми обновлениями в Interface Builder.
@IBDesignable final class GradientView: UIView {
@IBInspectable var startColor: UIColor = UIColor.red
@IBInspectable var endColor: UIColor = UIColor.blue
override class var layerClass: AnyClass {
get {
return CAGradientLayer.self
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setupGradient()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupGradient()
}
private func setupGradient() {
let gradient = self.layer as! CAGradientLayer
gradient.colors = [startColor.cgColor, endColor.cgColor]
}
}
Ответ 8
Нет, вы не можете. Вы можете использовать UISegmentedControl с одним сегментом в старых версиях sdk и xCode:
http://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/
Но теперь вы не можете сделать менее двух сегментов в одном UISegmentedControl. И даже таким образом вы не могли изменить цвета по умолчанию кнопок без кодирования.