Я работаю над своей второй задачей с быстрой архитектурой MVVM и без раскадровки, поэтому я попытался программно закодировать свой сегментированный элемент управления элементами типа [String], и он отлично работает, но теперь я хочу изменить элементы с помощью значка / изображения.
Я пытался изменить тип элементов с [String] на [UIImage] ...
import UIKit
class VehicleSegmentedControl:UIControl {
private var labels = [UILabel]()
var thumbView = UIView()
// here are my items of icons
var items:[UIImage?] = [UIImage(named: "car.png"),UIImage(named: "feet.png"),UIImage(named: "transit.png")]{
didSet{
setupLabels()
}
}
var selectedIndex : Int = 0 {
didSet{
displayNewSelectedIndex()
}
}
init(items: [UIImage]) {
super.init(frame: CGRect.zero)
self.items = items
setupView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
}
func setupView(){
layer.cornerRadius = frame.height / 2
layer.borderColor = UIColor.walkthroughOrangeAccent.cgColor
layer.borderWidth = 2
backgroundColor = UIColor.clear
setupLabels()
insertSubview(thumbView, at: 0)
}
override func layoutSubviews() {
super.layoutSubviews()
var selectedFrame = self.bounds
let newWith = selectedFrame.width / CGFloat(items.count)
selectedFrame.size.width = newWith
layer.cornerRadius = frame.height / 2
thumbView.frame = selectedFrame
thumbView.backgroundColor = .walkthroughOrangeAccent
thumbView.layer.cornerRadius = thumbView.frame.height / 2
let labelHeight = self.bounds.height
let labelWidth = self.bounds.width / CGFloat(labels.count)
for index in 0...labels.count - 1 {
let label = labels[index]
let xPosition = CGFloat(index) * labelWidth
label.frame = CGRect(x: xPosition,y: 0,width: labelWidth,height: labelHeight)
}
}
override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
let location = touch.location(in: self)
var calculatedIndex: Int?
for(index, item) in labels.enumerated() {
if item.frame.contains(location){
calculatedIndex = index
}
}
if calculatedIndex != nil {
selectedIndex = calculatedIndex!
sendActions(for:.valueChanged)
}
return false
}
func displayNewSelectedIndex(){
let label = labels[selectedIndex]
self.thumbView.frame = label.frame
}
func setupLabels(){
for label in labels {
label.removeFromSuperview()
}
labels.removeAll(keepingCapacity: true)
for index in 0..<items.count{
let label = UILabel(frame: CGRect.zero)
//label.text = items[index - 1]
//label.textAlignment = .center
//label.textColor = UIColor.white.withAlphaComponent(0.8)
//here is my ImageView
let imgview = UIImageView(image: items[index])
self.addSubview(imgview)
labels.append(label)
}
}
}
Я получаю 3 значка, отображаемых друг на друге, но не выровненных.
Большое спасибо, но не могли бы вы объяснить более подробно, как это сделать? Буду благодарен за вашу помощь.
Вы уже знаете, что делать. Просто установите рамки для изображений вместо меток.





Ваш
layoutSubviewsничего не делает с изображениями. Он по-прежнему обновляет ярлыки.