2017-02-18 8 views
1

Я выложил свое приложение в Xcode, используя вид iPhone SE. Кнопки и т. Д. Появляются под тестированием, как они должны.Почему эти кнопки не отображаются правильно в устройствах большего размера? (Swift)

Однако, когда я тестирую на большом экране, то есть на iPhone 7 возникает пара странных вещей.

1) Кнопки обнимают правую часть, даже если я ограничения установлен быть 20px от краев

enter image description here enter image description here

А во-вторых, градиент, который я применил к своим кнопкам, кажется, остановить 3/4 по кнопке в этом случае:

enter image description here

это тот же код вызывается в каждом экземпляре кнопки:

let orangeGradient = CAGradientLayer().orangeButtonColor() 
    orangeGradient.frame = self.joinCommunityButton.bounds 
    self.joinCommunityButton.layer.insertSublayer(orangeGradient, at: 0) 

extension CAGradientLayer { 

func bespokeColor() -> CAGradientLayer { 

let topColor = UIColor(red: (46/255.0), green: (63/255.0),blue: (81/255.0), alpha: 1) 
let bottomColor = UIColor(red: (22/255.0), green: (31/255.0),blue: (41/255.0), alpha: 1) 
let gradientColors: [CGColor] = [topColor.cgColor, bottomColor.cgColor] 
let gradientLocations: [Float] = [0.0, 1.0] 

let gradientLayer: CAGradientLayer = CAGradientLayer() 
gradientLayer.colors = gradientColors 
gradientLayer.locations = gradientLocations as [NSNumber]? 

return gradientLayer 

} 

func orangeButtonColor() -> CAGradientLayer { 

    let topColor = UIColor(red: (211/255.0), green: (115/255.0),blue: (28/255.0), alpha: 1) 
    let bottomColor = UIColor(red: (171/255.0), green: (80/255.0),blue: (14/255.0), alpha: 1) 
    let gradientColors: [CGColor] = [topColor.cgColor, bottomColor.cgColor] 
    let gradientLocations: [Float] = [0.0, 1.0] 

    let gradientLayer: CAGradientLayer = CAGradientLayer() 
    gradientLayer.colors = gradientColors 
    gradientLayer.locations = gradientLocations as [NSNumber]? 

    return gradientLayer 

} 

func purpleButtonColor() -> CAGradientLayer { 

    let topColor = UIColor(red: (112/255.0), green: (41/255.0),blue: (183/255.0), alpha: 1) 
    let bottomColor = UIColor(red: (85/255.0), green: (19/255.0),blue: (159/255.0), alpha: 1) 
    let gradientColors: [CGColor] = [topColor.cgColor, bottomColor.cgColor] 
    let gradientLocations: [Float] = [0.0, 1.0] 

    let gradientLayer: CAGradientLayer = CAGradientLayer() 
    gradientLayer.colors = gradientColors 
    gradientLayer.locations = gradientLocations as [NSNumber]? 

    return gradientLayer 

} 

func greenButtonColor() -> CAGradientLayer { 

    let topColor = UIColor(red: (35/255.0), green: (193/255.0),blue: (67/255.0), alpha: 1) 
    let bottomColor = UIColor(red: (31/255.0), green: (148/255.0),blue: (53/255.0), alpha: 1) 
    let gradientColors: [CGColor] = [topColor.cgColor, bottomColor.cgColor] 
    let gradientLocations: [Float] = [0.0, 1.0] 

    let gradientLayer: CAGradientLayer = CAGradientLayer() 
    gradientLayer.colors = gradientColors 
    gradientLayer.locations = gradientLocations as [NSNumber]? 

    return gradientLayer 

} 


} 

Вот скриншот того, что я считаю, являются параметры автоматической компоновки:

enter image description here

+0

Где вы применяете слой градиента к кнопкам? Включено ли автозапуск? Убедитесь, что вы добавили GradientLayers в 'viewDidAppear' ** или ** определите градиент внутри' viewDidLoad' и измените границы слоя в 'viewDidLayoutSubviews' – Rikh

+0

Да, у меня есть первые 3 строки этого кода (до расширения) в viewDidLoad – RDowns

ответ

7

viewDidLoad, autoLayout еще не вступил в силу, поэтому ваша кнопка bounds не являются конкретными устройствами.

Помещенный

orangeGradient.frame = self.joinCommunityButton.bounds в viewDidLayoutSubviews или viewDidAppear

Убедитесь, что добавить градиенты или выполнения задач, связанных с UIView кадра или границ послеviewDidLayoutSubviews, привлекаемого , если вы используете autoLayout.

Кроме того,

Не помещайте инициализацию CAGradientLayer() внутри viewDidAppear или viewDidLayoutSubviews функций как они называются несколько раз и будут продолжать добавлять слои к вашим UIView, вы должны просто изменить границы внутри этих двух методов ,

+0

Отлично! Это решило проблему с отсеченными градиентами. Благодарю. У меня нет правильного ответа на билет, но только потому, что я не хочу закрывать вопрос, все еще имея проблему с расположением кнопок, обнимающих правую сторону. – RDowns

+0

Возможно, это связано с тем, что градиент применяется по ширине больше, чем ширина кнопки, попробуйте установить для свойства 'clipsToBounds' значение true для данной кнопки и проверить, разрешает ли она вашу проблему. – Rikh

+0

Я переместил код градиента в viewDidAppear {}, и он тоже исправлен. Я думаю, что это было правильно, это было не то, что он был не в положении, просто градиент, кровоточащий по краю. спасибо – RDowns

-1

Пожалуйста, убедитесь, что вы используете AutoLayout в интерфейсе builder.If вы используете то сделать уверен, что они тоже оставили маржу.