当我改变它的框架时,UISlider 没有改变它的宽度 - ios Swift

Posted

技术标签:

【中文标题】当我改变它的框架时,UISlider 没有改变它的宽度 - ios Swift【英文标题】:UISlider is not changing its width when I change its frame - ios Swift 【发布时间】:2014-12-08 11:10:09 【问题描述】:

我已经使用情节提要创建了一个滑块,现在我尝试在 viewDidLoad() 方法中使用此代码更改其宽度:

var parentFrame:CGRect = self.view.frame
var currentFrame:CGRect = timeSlider.frame    // timeSlider is IBOutlet variable
timeSlider.frame = CGRect(x: currentFrame.origin.x + 20, y: currentFrame.origin.y, width:parentFrame.size.width, height: currentFrame.size.height)

但滑块宽度或位置没有改变,我不想以编程方式创建新的 UISlider,我想使用现有的 Outlet 并在运行时更改其宽度。所以有什么想法为什么这段代码不起作用?

附: - 实际上我想根据设备大小更改滑块宽度,但想将 UISlider 保留在情节提要中(不想在 viewDidLoad 中以编程方式创建它,它应该支持 ios 7 是否可能?)

根据 Apple documentation 它应该在我更改框架时自动更新视图..

【问题讨论】:

你为什么打电话给setNeedsUpdateConstraints?你使用自动布局吗?如果是这样,它不应该与手动设置框架混合。 即使我不说它没有改变框架.. & 我已经删除了所有自动布局约束,因为它在 iOS 7 中造成了问题,所以现在不使用自动布局... 滑块的位置不应随此代码更改,因为您设置的位置与它已经具有的完全相同的位置 (origin)。当您设置框架时,timeSlider 可能是 nilIBOutlet 未连接)? 插座已连接,我也尝试设置不同的原点进行测试但仍然无法正常工作,还在变量更改之前和之后打印帧变量但在视图中没有显示任何效果..查看更新问题。 【参考方案1】:

终于解决了,在设置框架前加上这行:

timeSlider.setTranslatesAutoresizingMaskIntoConstraints(true)

实际上我没有添加任何自动布局约束,但是它在运行时自动添加了这个约束,所以必须添加这个,但是在添加这一行后我收到警告'cannot simultaneously satisfy multiple constraints...',所以必须删除 viewDidLoad 中的所有约束. 所以最终的工作代码没有任何警告:

var parentFrame:CGRect = self.view.frame
var currentFrame:CGRect = timeSlider.frame
self.view.removeConstraints(self.view.constraints())
timeSlider.setTranslatesAutoresizingMaskIntoConstraints(true)
timeSlider.frame = CGRect(x: currentFrame.origin.x, y: currentFrame.origin.y, width:parentFrame.size.width - 14, height: currentFrame.size.height)

即使我已经删除了所有自动布局约束,我仍然无法理解为什么它要添加自动布局约束,但无论如何上面的代码解决了这个问题..

【讨论】:

以上是关于当我改变它的框架时,UISlider 没有改变它的宽度 - ios Swift的主要内容,如果未能解决你的问题,请参考以下文章

tk.Text 没有改变它的高度,即使传播关闭

当我滚动我的Recyclerview时,图像会不断改变它的位置并重复图像

UIScrollView 框架没有改变

CListCtrl 的 EnableWindow(FALSE) 不会改变它的外观

当 UISlider 值改变时会调用啥?

IOS - 当滑块值改变时设置 UILabel Swift