2016-06-16 2 views
3
let gradient: CAGradientLayer = CAGradientLayer() 
let colorTop = UIColor(red: 112.0/255.0, green: 219.0/255.0, blue: 155.0/255.0, alpha: 1.0).CGColor 
let colorBottom = UIColor(red: 86.0/255.0, green: 197.0/255.0, blue: 238.0/255.0, alpha: 1.0).CGColor 

gradient.colors = [colorTop, colorBottom] 
gradient.startPoint = CGPoint(x: 0.0, y: 0.5) 
gradient.endPoint = CGPoint(x: 1.0, y: 0.5) 
gradient.frame = loginButton.bounds 
gradient.cornerRadius = 5 
loginButton.layer.addSublayer(gradient) 

Gradient too longSwift: добавление слоя градиента к кнопке. Длина слоя ошибка

Полученный градиент сбегает выходит за пределы кадра кнопки. Почему это происходит?

+0

Возможно, попробуйте установить свойство 'bounds' слоя градиента равным слою loginButton'а? –

ответ

2

Является ли кадр вашего Вход Баттона правильно? Это кажется правильным, когда я воспроизвожу

 let loginButton = UIButton(frame: CGRect(x: 10, y: 50, width: 300, height: 30)) 
     self.view.addSubview(loginButton) 

     let gradient:CAGradientLayer = CAGradientLayer() 
     let colorTop = UIColor(red: 112.0/255.0, green: 219.0/255.0, blue: 155.0/255.0, alpha: 1.0).CGColor 
     let colorBottom = UIColor(red: 86.0/255.0, green: 197.0/255.0, blue: 238.0/255.0, alpha: 1.0).CGColor 

     gradient.colors = [colorTop, colorBottom] 
     gradient.startPoint = CGPoint(x: 0.0, y: 0.5) 
     gradient.endPoint = CGPoint(x: 1.0, y: 0.5) 
     gradient.frame = loginButton.bounds 
     gradient.cornerRadius = 5 

     loginButton.layer.addSublayer(gradient) 

И появляются, как показано ниже

enter image description here

3

Добавить clipsToBounds и cornerRadius в loginbutton. Это должно решить проблему.

loginButton.clipsToBounds = true 
loginButton.layer.cornerRadius = 5; 
+0

Отличный ответ. Я использовал пользовательскую кнопку, чтобы я мог настроить цвет рамки, радиус и все, что было на экране запуска, и при создании градиентного фона цвет выходил за границу. Добавление клиповToBounds = true для моей пользовательской кнопки решило проблему. Благодарю. – Saik

6

Возможно, вы устанавливаете слой градиента в viewDidLoad() или viewWillAppear(). В это время контроллер не рассчитал размеры просмотров. В то время вы добавляете, что размер этой подуровня не был рассчитан, поэтому размер подслоя неправильный. Поэтому вы должны исправить следующее:

  1. Прежде всего, вы должны добавить градиент в viewDidAppear(), в этот момент рассчитываются все размеры вида.
  2. Во-вторых, вы должны использовать layer.insertSublayer (layer, atIndex: index) вместо addSublayer (layer). Потому что в вашем случае подуровень скроет кнопки нативного слоя (название, фон ...)
  3. Вы должны пересчитать размер вашего подуровня в viewDidLayoutSubviews(). Потому что, когда ваша кнопка изменит свой размер (при вращении, например), подуровень не изменит свой кадр, поэтому вы должны изменить его самостоятельно.
+0

Спасибо! Постановка моего кода в viewWillAppear работает, решает проблему. – user2946632

+0

Не возражаете ли вы ответить на быстрый ответ? После ввода кода в viewdidload, segues для этого контроллера представления выглядит плохо, потому что анимированный vc не имеет прикрепленного градиента. Как мне обойти это? – user2946632

+1

К сожалению, для позднего ответа было очень занято. Вы можете делать следующие вещи: 1. Подкласс uibutton, установить свойство CAGradientLayer, добавить этот слой в метод init и переопределить метод layoutSubviews(), где вы должны пересчитать кадр CAGradientLayer, например: gradientLayer.frame = button.bounds; 2. Вы можете создать это свойство слоя в контроллере, добавить его к кнопке в viewDidLoad и пересчитать кадр слоя в viewDidLayoutSubview. Я бы использовал первый метод. –

Смежные вопросы