Угловой радиус обзора в подклассе UITableViewCell

Я пытаюсь создать круглое представление в своем подклассе tablevviewcell

Я установил для cornerRadius половину ширины, но рамка возвращает 0. Таким образом, радиус угла установлен неправильно.

initialView.autoPinEdgesToSuperviewEdges(with: UIEdgeInsetsMake(5.0, 5.0, 5.0, 0.0), excludingEdge: .trailing)
    initialView.autoMatch(.width, to: .height, of: initialView)
    initialView.layer.cornerRadius = initialView.frame.size.width/2

Спасибо

override func layoutSubviews() {
    super.layoutSubviews()

    initialView.layer.cornerRadius = initialView.frame.size.width/2
    print(initialView.frame)

}

Кадр все еще печатается -> (0,0, 0,0, 0,0, 0,0)

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    contentView.addSubview(initialView)
    contentView.addSubview(nameLabel)
    setupConstraints()
}

override func layoutSubviews() {
    super.layoutSubviews()

    initialView.layer.cornerRadius = initialView.frame.size.width/2
    print(initialView.frame)

}

person user2512523    schedule 31.03.2017    source источник
comment
что такое initialView?   -  person Forest Kunecke    schedule 31.03.2017
comment
это просто UIView   -  person user2512523    schedule 31.03.2017
comment
private (set) lazy var initialView: UIView = {let initialView = UIView (frame: .zero) return initialView} ()   -  person user2512523    schedule 31.03.2017


Ответы (2)


Способ исправить это - создать подкласс UITableViewCell и поместить свой код в layoutSubviews:

override func layoutSubviews() {
    super.layoutSubviews()

    initialView.layer.cornerRadius = initialView.frame.size.width/2
}

И поместите остальную часть кода вашего вопроса в свой init() код:

func init() {
    // other stuff...

    setupInitialView()
}

func setupInitialView() {
    initialView.autoPinEdgesToSuperviewEdges(with: UIEdgeInsetsMake(5.0, 5.0, 5.0, 0.0), excludingEdge: .trailing)
    initialView.autoMatch(.width, to: .height, of: initialView)
}

Мой полный (рабочий!) Класс UITableViewCell выглядит следующим образом. Вместо использования модуля PureLayout я использовал метод расширения, который в основном делает то же самое.

//
//  MyTableViewCell.swift
//  tableviewheader-test
//
//  Created by Forest Kunecke on 3/31/17.
//  Free as in free beer!
//

import UIKit

class MyTableViewCell: UITableViewCell {

    private(set) lazy var initialView: UIView = {
        let initialView = UIView(frame: .zero)
        return initialView
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        //
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        contentView.addSubview(initialView)

        setupInitialView()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    func setupInitialView() {
        self.contentView.addConstraintsWithFormat("V:|-5-[v0]-5-|", views: initialView)
        self.contentView.addConstraintsWithFormat("H:|-5-[v0]-0-|", views: initialView)

        initialView.backgroundColor = UIColor.red
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        self.initialView.layer.cornerRadius = frame.size.width/2
    }
}

extension UIView {
    func addConstraintsWithFormat(_ format: String, views: UIView...) {
        var viewsDictionary = [String: UIView]()

        for (index, view) in views.enumerated() {
            let key = "v\(index)"
            view.translatesAutoresizingMaskIntoConstraints = false
            viewsDictionary[key] = view
        }
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary))
    }
}

Вот скриншот (где UITableViewController возвращает view.frame.width для heightForRowAt):

введите здесь описание изображения

Если хотите, я также могу опубликовать UITableViewController, который я использовал для тестирования этого кода.

person Forest Kunecke    schedule 31.03.2017
comment
вам нужно вызвать cell.layoutIfNeeded ()? из класса ViewController? - person user2512523; 31.03.2017
comment
Это, вероятно, не решит вашу проблему, потому что проблема заключается в том, что значение, которое фактически установлено во фрейме представлений, основано на представлении в виде пера, а не на представлении, инициализированном в вашем tableView. - person Sethmr; 31.03.2017
comment
Не использовать раскадровки или перья. Все поставлено программно. - person user2512523; 31.03.2017
comment
Просто добавил код к исходному вопросу. Мой установочный код находится в функции инициализации переопределения - person user2512523; 31.03.2017

Вы выполняете взаимодействие до того, как представление будет выложено. Вам нужно создать подкласс UITableViewCell и переопределить layoutSubviews следующим образом:

class CustomCell: UITableViewCell {
    override func layoutSubviews() {
        super.layoutSubviews()
        initialView.layer.cornerRadius = initialView.frame.size.width/2
    }
}
person Sethmr    schedule 31.03.2017
comment
вам нужно вызвать cell.layoutIfNeeded ()? из класса ViewController? Все еще не работает. Я печатаю фрейм в layoutSubviews () все еще печатаю 0.0) - person user2512523; 31.03.2017