我想创建一个包含 3 个元素的垂直堆栈视图。我只想要第二个和最后一个元素之间有更多的空间。所以我考虑添加到最后一个元素:
mylastelement.layoutMargins = UIEdgeInsets(top:30, left:0,bottom:0, right:0)
Run Code Online (Sandbox Code Playgroud)
但布局边距没有应用在我的堆栈视图中。有没有什么简单的方法可以实现这一点(我想避免修改最后一个元素的内部高度)。
编辑:我只是尝试通过执行以下操作来增加框架内的第二个元素高度(+50):
my2ndElementLabel.sizeToFit()
my2ndElementLabel.frame = CGRect(x:my2ndElementLabel.frame.origin.x,y:lmy2ndElementLabel.frame.origin.y,
width:my2ndElementLabel.frame.width, height:my2ndElementLabel.frame.height + 50)
Run Code Online (Sandbox Code Playgroud)
但没有效果。
EDIT2:我尝试向我的 UIStackView 添加随机视图,但该视图被忽略!在理解 UIKit 如何工作时可能错过了一些东西?...:
let v = UIView(frame:CGRect(x:0,y:0,width:100,height:400))
v.backgroundColor = .red
myStackView.addArrangedSubview(v)
//...
Run Code Online (Sandbox Code Playgroud) 我正在处理来自JSON的数据,我必须将它们解析成一个快速的对象.我用这个代码:
struct MyGPSCoords {
var latitude:Double
var longitude:Double
var accuracy:Int
var datetime:NSDate
init?(infobrutFromJson_:[String:String]?)
{
guard let infobrut = infobrutFromJson_ else {
// first time the user sign up to the app, php server returns "null" in Json
return nil
}
guard
let lat:Double = Double(infobrut["latitude"] ?? "nil"),
let lng = Double(infobrut["longitude"] ?? "nil"),
let acc = Int(infobrut["accuracy"] ?? "nil"),
let dtm = NSDate(timeIntervalSince1970: Double(infobrut["time"] ?? "nil"))
else {
print("warning : unable to parse data from server. Returning nil");
return nil …Run Code Online (Sandbox Code Playgroud) 我有一个水平 UIStackView 包含几个排列的子视图。
当用户单击按钮时,我想删除一个已排列的子视图(我们称之为 A),但在此之前我想做一个快速动画。我想做我自己的动画,所以我不能只stackView.removeArrangedSubview制作默认基本动画的动画,而不是我想要的特殊动画。
在 A 中,我有另一个视图(我们称之为 B),它是使用自动布局的 centeredX 和 centeredY 。
当我将安排的子视图 A 的 A.widthAnchor.constant 设置为 0 时,其他视图arrangedsubviews逐渐取代它,子视图 B 在动画之前丢失其 CenterX 并向左移动。或者也许它不会失去centerX,但它是在一个小A上的centeredX(其宽度= 0,并从左侧开始),但A不应该立即将其宽度设置为0,而是在动画完成之后.. 。
我尽力解释清楚,但我知道这可能会令人困惑。这是显示问题的视频。A中的图像 (B) arrangedsubview(占据整个屏幕)在动画开始之前“跳”到左侧。
https://drive.google.com/open?id=1nTDRe5zirbuQi86WVBTuU-iDU8aq0lcw
这是我制作此动画的非常简单的代码:
UIView.animate(withDuration:4,delay:0, options:.curveEaseInOut, animations : {
self.c.constant = 0 // c is A.widthAnchor constraint
self.stackView.layoutIfNeeded()
},completion: { _ in
// done
})
Run Code Online (Sandbox Code Playgroud) 我有一个数组,是从服务器发送的 JSON 中解码的。我想在一行代码中检索节点的值并将其转换为枚举值。可能会发生几个错误:(1)节点不存在,(2)节点值不是字符串(我的枚举只有字符串原始值),或者(3)提供的字符串不适合枚举中的任何现有值。
目前,我对 Dictionary 进行了扩展,使我能够将 (1) 和 (2) 放在一行中用于枚举以外的其他内容,并且如果发生错误,则可以轻松传播错误:
struct MemberOptions : MyDecodable
{
var name:String
var age:Int
var facebookAccount:FacebookAccount
init(from array:[String:Any]) throws
{
// throw exception if node name doesn't exist, is json<null> or if it's value is not castable to the providen parameter (raw types or more complex object implementing MyDecodable protocol)
name = try array.getSafe("name", String.self)
age = try array.getSafe("age", Int.self)
facebookAccount = try array.getSafe("fb", FacebookAccount.self)
}
}
Run Code Online (Sandbox Code Playgroud)
现在是棘手的部分:我想要 (3) 来表示枚举,也就是说,对于给定的枚举,如果提供的字符串原始值不是已知的枚举值,则在一行中传播错误。我看到如果原始字符串值不存在,枚举的默认 init 返回 nil 。我希望它抛出异常。
当然,我可以为所有枚举创建一个会引发异常的 …