2016-02-15 2 views
0

Я сам познакомился с VFL, и я пытаюсь найти что-то, что мне нужно.Добавление ограничений с помощью VFL - iOS Swift

У меня есть изображение, выровненное как показано на рисунке ниже в портретном режиме. enter image description here

В пейзаж вид выглядит, как показано ниже

enter image description here

В пейзаже я хочу, чтобы изображение по центру вдоль оси Y и то есть немного выше, чем показано на рисунке.

У меня есть ниже VFL код

override func viewDidLoad() { 

    googleSignButton = UIImageView() 
    googleSignButton!.translatesAutoresizingMaskIntoConstraints = false 
    googleSignButton!.image = UIImage(named: "google.png") 
    self.view!.addSubview(googleSignButton!) 

    let buttonWidth:CGFloat = 50 
    let views:[String:UIImageView] = Dictionary(dictionaryLiteral: ("google",googleSignButton!)) 
    let metrics = ["dim" : buttonWidth, 
         "horizontalPadding" : (UIScreen.mainScreen().bounds.width - (3 * buttonWidth))/3, 
      "verticalPadding" : (UIScreen.mainScreen().bounds.height * 0.5) - (buttonWidth * 0.5)] 

     let horizontalConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:|-horizontalPadding-[google(dim)]", options:[] , metrics: metrics, views: views) 
     let verticalConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:|-verticalPadding-[google(dim)]", options:[] , metrics: metrics, views: views) 
     self.view.addConstraints(verticalConstraint) 
     self.view.addConstraints(horizontalConstraint) 
} 

Как я могу добиться этого. Режим Potrait выглядит отлично и в ландшафте изображение должно быть центрировано по вертикали.

спасибо.

Редактировать

Обновлено Код:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 

     super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 

     coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in 



      }) { (UIViewControllerTransitionCoordinatorContext) -> Void in 

       self.calculateConstraints() 

     } 
    } 

    func calculateConstraints() { 

     let buttonWidth:CGFloat = Common.sharedCommon.calculateDimensionForDevice(50) 

     let views:[String:UIImageView] = Dictionary(dictionaryLiteral: ("google",googleSignButton!)) 
     let metrics = ["dim" : 50.0, 
      "horizontalPadding" : (UIScreen.mainScreen().bounds.width - (3 * buttonWidth))/3, 
      "verticalPadding" : (UIScreen.mainScreen().bounds.height * 0.5) - (buttonWidth * 0.5)] 


     if let horizontal = horizontalConstraint, let vertical = verticalConstraint { 

      NSLayoutConstraint.deactivateConstraints([horizontal]) 
      NSLayoutConstraint.deactivateConstraints([vertical]) 
     } 

     horizontalConstraint = NSLayoutConstraint.constraintsWithVisualFormat("H:|-horizontalPadding-[google(dim)]", options:[] , metrics: metrics, views: views)[0] 
     verticalConstraint = NSLayoutConstraint.constraintsWithVisualFormat("V:|-verticalPadding-[google(dim)]", options:[] , metrics: metrics, views: views)[0] 

     NSLayoutConstraint.activateConstraints([horizontalConstraint!,verticalConstraint!]) 

} 

Изображения: enter image description here

enter image description here

+0

Где ты звонишь этот код? – tktsubota

+0

Я обновил код – slysid

ответ

0

Так что ваша проблема заключается в том, что ограничения не обновляются при вращении, так используя ту же вертикальную привязку для пейзажа.

Во-первых, вы действительно хотите сохранить свои ограничения в свойствах для деактивации. В контроллере представления:

var verticalConstraints: [NSLayoutConstraint]? 
var horizontalConstraints: [NSLayoutConstraint]? 

Затем обернуть код ограничения в функции (обратите внимание, я ее немного модифицировал):

function calculateButtonConstraints() { 
    let buttonWidth:CGFloat = 50 
    let views:[String:UIImageView] = Dictionary(dictionaryLiteral: ("google",googleSignButton!)) 
    let metrics = ["dim" : buttonWidth, 
        "horizontalPadding" : (UIScreen.mainScreen().bounds.width - (3 * buttonWidth))/3, 
     "verticalPadding" : (UIScreen.mainScreen().bounds.height * 0.5) - (buttonWidth * 0.5)] 

    if let horizontal = horizontalConstraints, let vertical = verticalConstraints { 
     NSLayoutConstraint.deactivateConstraints(horizontal) 
     NSLayoutConstraint.deactivateConstraints(vertical) 
    } 

    horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-horizontalPadding-[google(dim)]", options:[] , metrics: metrics, views: views) 
    verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|-verticalPadding-[google(dim)]", options:[] , metrics: metrics, views: views) 

    NSLayoutConstraint.activateConstraints(horizontalConstraints!) 
    NSLayoutConstraint.activateConstraints(verticalConstraints!) 
} 

Обратите внимание, что я использовал NSLayoutConstraint.activateConstraints: вместо этого, поскольку это является предпочтительным способом. Кроме того, это частично связано с deactivateConstraints:.

Тогда вместо этого кода в viewDidLoad:, поставить это:

calculateButtonConstraints() 

Далее, добавьте в ваш контроллер представления:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 

    coordinator.animateAlongsideTransition(nil, completion: { [unowned self] 
     self.calculateButtonConstraints() 
    }) 

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 

} 
+0

Я попробовал ваше предложение (исправил некоторые ошибки синтаксиса) Похоже, что он работает, но изображение выглядит намного больше, чем размер, определенный в коде. – slysid

+0

@slysid Это странно. Можете ли вы связать изображение нового, большего размера? – tktsubota

+0

@slysid Я отредактировал сообщение (исправлено синтаксис), не знаю, что это что-то изменит. – tktsubota

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