ボタンをサブクラス化し、layoutSubviews()
関数をオーバーライドして「丸め」コードを配置することで、より信頼性の高い結果を得ることができます。
あなたが境界線を追加したい場合はまず、あなたが複数の「国境のサブレイヤー」を追加したい...ので、これにあなたのUIView
拡張子を変更しないでください:
extension UIView {
func roundCorners(corners: UIRectCorner, radius: CGFloat, borderWidth: CGFloat?, borderColor: UIColor?) {
let maskPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let maskLayer = CAShapeLayer()
maskLayer.frame = self.bounds
maskLayer.path = maskPath.cgPath
self.layer.mask = maskLayer
self.layer.masksToBounds = true
if (borderWidth != nil && borderColor != nil) {
// remove previously added border layer
for layer in layer.sublayers! {
if layer.name == "borderLayer" {
layer.removeFromSuperlayer()
}
}
let borderLayer = CAShapeLayer()
borderLayer.frame = self.bounds;
borderLayer.path = maskPath.cgPath;
borderLayer.lineWidth = borderWidth ?? 0;
borderLayer.strokeColor = borderColor?.cgColor;
borderLayer.fillColor = UIColor.clear.cgColor;
borderLayer.name = "borderLayer"
self.layer.addSublayer(borderLayer);
}
}
}
次に、UIButton
サブクラスを追加:
class RoundedButton: UIButton {
var corners: UIRectCorner?
var radius = CGFloat(0.0)
var borderWidth = CGFloat(0.0)
var borderColor: UIColor?
override func layoutSubviews() {
super.layoutSubviews()
// don't apply mask if corners is not set, or if radius is Zero
guard let _corners = corners, radius > 0.0 else {
return
}
roundCorners(corners: _corners, radius: radius, borderWidth: borderWidth, borderColor: borderColor)
}
}
これはあなたのカップルの利点を与える:と、ボタンの枠の変更(例えば、デバイスを回転させる)1)これは、そのマスク層のフレームを更新する、および2)あなたがいずれかのカスタムからこれらの値を設定することができます細胞クラスまたはcellForRowAtの
どちらの方法でも、btnStatus
クラスをUIButton
からRoundedButton
に変更します(ストーリーボードと@IBOutlet
接続の両方)。その後
これにあなたのCustomTableViewCell
を変更します。
class CustomTableViewCell: UITableViewCell {
@IBOutlet weak var btnStatus: RoundedButton!
override func awakeFromNib() {
super.awakeFromNib()
// set up corner maskign
btnStatus.corners = .bottomRight
btnStatus.radius = 7.0
// set if desired
// btnStatus.borderWidth = 2.0
// btnStatus.borderColor = .blue
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
そして最後に、あなたのcellForRowAt
関数は次のようになります。
それを行う必要があります
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomTableViewCell
return cell
}
...
について与えられているどのようなエラー制約を破る? – benjiiiii
あなたのコードを見ることなく、制約が破られたら、それを 'UIView'の中に置き、そのコンテナに' UIView'制約を与えます。この制約は、ビュー内に何があるか、角が丸くなるかどうかは気にしません。 – sconewolf
@benjiiiii:まったくエラーがなく、ちょうどボタンが整列していません... – mihatel