我正在构建一个带有图像的滚动视图的应用程序。最重要的是,我根据自定义类添加视图。想象一下带有引脚的滚动UI视图图片。背景图片然后每个引脚都是一个新层。
这样的事情(不是完整的代码,但非常全面,会让你很好地了解我想要做的事情。)
class MapViewController: UIViewController, UIScrollViewDelegate, UITextFieldDelegate, CLLocationManagerDelegate {
var scrollView : UIScrollView!
var imageView : UIImageView!
override func viewDidLoad() {
create()
super.viewDidLoad()
}
func create() {
let dynamicUserPin = UserPin(userID: "UX2318afjk2-fa8hasd-hasdf-jada-fjasd", name: "Ric", posX: Int(1500), posY: Int(1800), pictureURL: "11056102_10100155919186355_3729750518855248330_n.jpg", direction: 1, colour: "Red", currentTrack: 33, lastTimeConnected: Date())
dynamicUserPin.tag = 1000
containerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.viewTapped(_:))))
imageView.addSubview(dynamicUserPin)
containerView.addSubview(imageView)
scrollView.addSubview(containerView)
view.addSubview(scrollView)
}
}
我的问题是我必须找到非常动态的视图(UserPins)并随着时间的推移而改变。我可以通过迭代视图来找到用户引脚。那没问题。问题是如何在没有标签的情况下做到这一点,因为这意味着保持我的用户ID和标签之间的映射,我试图避免。我如何获得子视图的详细信息?我创建了一个扩展来获取子视图:
extension UIView {
func subviewsList() -> [UIView] {
var subviews = self.subviews
if subviews.count == 0 {
return subviews + []
}
for v in subviews {
subviews += v.subviewsList()
}
return subviews
}
}
我的视图类看起来像这样:
导入UIKit
class UserPin: UIView {
var userID : String?
var name : String?
var posX : Int?
var posY : Int?
var pictureURL : String?
var direction : Int?
var colour : String?
var currentTrack : Int?
var lastTimeConnected : Date?
init(userID: String, name: String, posX: Int, posY: Int, pictureURL: String, direction: Int, colour: String, currentTrack : Int, lastTimeConnected : Date)
{
self.userID = userID
self.name = name
self.posX = posX
self.posY = posY
self.pictureURL = pictureURL
self.direction = direction
self.colour = colour
self.currentTrack = currentTrack
self.lastTimeConnected = lastTimeConnected
super.init(frame: CGRect(x: posX, y: posY, width: 100, height: 100))
print("finished init")
self.addControls(userID, name: name, posX: posX, posY: posY, pictureURL: pictureURL, direction: direction, colour: colour, currentTrack: currentTrack, lastTimeConnected: lastTimeConnected)
}
那么如何获取我添加的视图的用户ID?
答案 0 :(得分:1)
您的UIViewController
子类应包含一个名为mapPins
的可变集,声明如下:
var mapPins: Set
无论何时创建新引脚,都要将其插入到该可变集中,并将其添加为subView
。
然后,如果您需要访问所有引脚,只需遍历mapPins
集的内容。
我想问题是如何再次访问view对象以获取用户ID?
如何通过点击它来获取引脚?
有几种方法可以做到这一点。我建议为每个引脚视图设置一个UITapGestureRecognizer
。 (在创建图钉的同时制作手势识别器。)
为点击识别器创建一种方法,以便调用UIViewController
子类:
func handleTapOnPin(_ recogniser: UITapGestureRecognizer?) {
// a pin has been tapped on
}
将手势识别器的目标设置为子类,并将操作设置为此方法的选择器,如下所示:#selector(self.handleTapOnPin(_:))
。
在该方法中,要访问您的图钉,您可以执行recognizer.view()
。