2016-02-15 54 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