如何将2个按钮对齐左和右UIToolbar的右边界

时间:2015-01-22 17:22:47

标签: ios objective-c swift

我一直在尝试使用Cocoa和Swift(我是一个菜鸟)并遇到了一个我似乎无法解决的问题:

我们假设我创建了一个UIToolbar并为其添加了两个按钮:'Cancel'和'Accept'。我想将“取消”按钮对齐到UIToolbar的左边缘(当然,默认情况下可以正常工作),将“接受”按钮对齐到右边缘。有一些简单的方法如何实现正确的对齐?这就是我目前所拥有的:

let toolbar = UIToolbar(frame: CGRectMake(0, 0, w, 35))
toolbar.backgroundColor = UIColor(red: 0.75, green: 0.75, blue: 0.75, alpha: 0.95)
let acceptButton = UIBarButtonItem(title: "Accept", style: UIBarButtonItemStyle.Done, target: self, action: "buttonPressed:")
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "buttonPressed:")
let space = UIBarButtonItem(customView: UIView(frame: CGRectMake(0, 0, 50, 10))) // <- MEH! this is not dynamic!
toolbar.items = [acceptButton, space, cancelButton]
view.addSubview(toolbar)

我正在使用另一个UIBarButtonItem来创建空间,但这不是动态的(这里的许多答案都提出了这个解决方案 - 没有好处)。所以我期待我会得到UIBarButtonItems的框架,但我似乎无法使其工作,它们没有.frame属性。所以在另一个SO答案中,这是建议:

UIView *view= (UIView *)[self.toolbar.subviews objectAtIndex:0]; // 0 for the first item

这也不起作用,似乎没有直接的subview-child是UIBarButtonItem(因此它将宽度返回为375)。

设置标签是不行的......:

let cancelButton.tag = 1
let acceptButton.tag = 0
let acceptButtonFrame = toolbar.viewWithTag(0)!.frame
let cancelButtonFrame = toolbar.viewWithTag(1)!.frame
println(acceptButtonFrame.width)
println(cancelButtonFrame.width)

收益率:

  

375.0

     

致命错误:在解包可选值时意外发现nil

     

(LLDB)

有什么办法吗? : - /任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:5)

是的,只需在两者之间添加一个灵活的空间。

let toolbar = UIToolbar(frame: CGRectMake(0, 0, w, 35))
toolbar.backgroundColor = UIColor(red: 0.75, green: 0.75, blue: 0.75, alpha: 0.95)
let acceptButton = UIBarButtonItem(title: "Accept", style: UIBarButtonItemStyle.Done, target: self, action: "buttonPressed:")
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "buttonPressed:")
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil);
toolbar.items = [acceptButton, flexibleSpace, cancelButton]

不确定这是否是正确的语法,但该类仍为UIBarButtonItem。唯一的区别是systemItem是UIBarButtonSytemItem.FlexibleSpace

评论:

  

所以在另一个SO答案中,这是建议:

UIView *view= (UIView *)[self.toolbar.subviews objectAtIndex:0]; // 0 for the first item
     

这也不起作用,好像没有直接的子视图 - 孩子是一个   UIBarButtonItem(因此它将宽度返回为375)。

不起作用的原因是因为[self.toolbar.subviews objectAtIndex:0]是Objective-C代码,而不是Swift代码。

答案 1 :(得分:3)

您必须使用FlexibleSpace buttonSystem作为分隔符

let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace,
              target: nil,
              action: nil);

这会自动缩放

干杯,