inline
хорошо работает с концепцией процедурной абстракции :
inline double square (double x) { return x*x;}
int squareTwice(double x) {
double first = square(x);
double second = square(x);
return first * second;
}
Вышеупомянутое в корне похоже на следующее:
int squareTwice(double x) {
double first = x*x;
double second = x*x;
return first * second;
}
Это происходит потому, что когда компилятор inline-расширяет вызов функции, код функции вставляется в поток кода вызывающего; поэтому, может быть, проще подвергнуть процедуре абстрагирование второго примера к первому примеру.
Процедурная абстракция позволяет разбить подпрограмму на более мелкие подпрограммы, которые намного легче читать (хотя это может быть стиль выбор).
У меня была такая же проблема с моим представлением коллекции, лучшее решение - добавить функциональность в ваш GameCollectionViewCell
скажем updateView()
и добавить элементы пользовательского интерфейса в подпредставление
func updateView() {
var princess : UIImageView = UIImageView(image: UIImage(named: "CategoryImages/"+card!.contentImage)?.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )))
var size : CGSize = CGSize(width: rect.size.width-1.8, height: rect.size.height-1.8)
var origin : CGPoint = CGPoint(x: rect.origin.x+0.9, y: rect.origin.y+0.9)
var princessRect : CGRect = CGRect(origin: origin, size: size)
princess.frame = princessRect
princess.layer.masksToBounds = true
princess.layer.cornerRadius = 2;
addSubview(princess)
}
И внутри viewcontroller при создании ячейки для indexpath вызывает вышеуказанный метод
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! GameCollectionViewCell
cell.updateView()
return cell
}
Это правда, что вы не должны переопределять метод в расширении, точно так же, как вы делаете это в методах lifeCycle ваших контроллеров (например, viewDidLoad()
. Также обратите внимание, что в большинстве случаев вам следует вызывать его super.someFunc()
). Вместо этого создайте подкласс.
При добавлении подпредставлений в подкласс UICollectionViewCell
поместите свои коды в метод init:
override init(frame: CGRect) {
super.init(frame: frame)
}
Если вы хотите что-то изменить в слое своего представления, Вы можете переопределить layoutSubviews()
:
override func layoutSubviews() {
super.layoutSubviews()
}
Надеюсь, это поможет.
Большое спасибо @RobertDresler. Он спас мой день. После перезагрузки CollectionView, если вы вызываете метод setNeedsDisplay (), вызывается метод draw (). Пожалуйста, проверьте ниже.
override func prepareForReuse() {
super.prepareForReuse()
setNeedsDisplay()
}