Подтвердить что ты не робот

Есть ли способ сделать цвет фона градиента в построителе интерфейса?

Для моего приложения я использую TableView и используя настраиваемые UITableViewCells.

Я настроил свои ячейки через построитель интерфейса, а не программно. Есть ли способ сделать цвет фона моей настроенной ячейки градиентом в построителе интерфейса?

Спасибо.

4b9b3361

Ответ 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. И даже таким образом вы не могли изменить цвета по умолчанию кнопок без кодирования.