【发布时间】:2017-07-18 19:48:39
【问题描述】:
作为一个简单的起点。我正在尝试创建一个中间有一个活动指示器的自定义按钮。 点击后 - 它会表明它正在思考
我几乎停留在第 1 步 - 将指示器添加到周围视图的中心。 无论想要约束我尝试它总是出现在左上角。
我错过了什么?
这是我的游乐场代码。
//: Playground - noun: a place where people can play
import PlaygroundSupport
import UIKit
class ConnectButton : UIView {
fileprivate let activityIndicator: UIActivityIndicatorView = {
let activityIndicator = UIActivityIndicatorView()
activityIndicator.color = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
activityIndicator.hidesWhenStopped = true;
activityIndicator.stopAnimating();
activityIndicator.activityIndicatorViewStyle = .white;
return activityIndicator;
}()
private func initView() {
translatesAutoresizingMaskIntoConstraints = true;
addSubview(activityIndicator);
NSLayoutConstraint.activate([
activityIndicator.centerYAnchor.constraint(equalTo: self.centerYAnchor),
activityIndicator.leftAnchor.constraint(equalTo: self.centerXAnchor)
])
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder);
self.initView();
}
override init(frame: CGRect) {
super.init(frame: frame);
self.initView();
}
public func startAnimating() {
activityIndicator.startAnimating();
}
public func stopAnimating() {
activityIndicator.stopAnimating();
}
}
let dimensions = (width:200, height: 50);
let connectButton = ConnectButton(
frame: CGRect(
x: dimensions.width / 2,
y: dimensions.height / 2,
width: dimensions.width,
height: dimensions.height
)
)
connectButton.startAnimating();
connectButton.backgroundColor = #colorLiteral(red: 0.1764705926, green: 0.4980392158, blue: 0.7568627596, alpha: 1);
PlaygroundPage.current.liveView = connectButton
【问题讨论】:
-
添加 self.view.layoutIfNeeded() 或 activityIndicator.layoutIfNeeded() 以更新约束更改。但是,由于我没有在 Swift 中编码,我真的不明白 self.centerYAnchor 是什么,我在您的代码中的任何地方都看不到它,self.centerXAnchor 也没有。如果您在 viewDidLoad 方法中更改这些约束,请记住,当您在 viewDidLoad 中时,您的 superView 约束尚未计算,除非您已经为其设置了特定的高度/宽度。
-
我将 self.layoutIfNeeded() 和 activityIndicator.layoutIfNeeded() 添加到 initView 中,然后最后在 Playground 代码中 - 没有变化
-
在初始化 subView 后将其添加到您的 superView。
-
我直接在视图中创建它作为可重用的自定义控件。没有 UIViewController(我正在游乐场中进行原型设计 - 我假设游乐场代码中的最后一个代码会产生类似的效果)。我正在使用 translatesAutoresizingMaskIntoConstraints = true。我可以删除它并将实际的高度和宽度常量放入 - 但具有相同的“不居中”效果。
-
嗯,你读过下面tomahhs的回答吗?我将添加另一个解决方案,您可以尝试简化事情