我有一个UIViewController? SingleEventController显示事件。因为它有动态信息要显示,所以我选择创建一个新类UIScrollView EventScrollView。我试图基于这个很好解释的答案来意识到这一点
。
我尝试应用纯自动布局方法:在其中创建另一个UIView contentView,其中包含所有信息并锚定到 scrollView 的所有四个锚点。
scrollView 的 contentSize 是在 SingleEventController 的viewDidLayoutSubviews函数中确定的。
我的挣扎是,rightAnchor 似乎有问题。所有的信息元素都超过了视图的边界,较大的自动换行UILabels不起作用,并且在正确的锚点处布置的每个项目都消失了。(例如,作为 contentView 子视图的UITableView nopePeopleTV 中的用户名。)
SingleEventController中的代码:
view.addSubview(scrollView)
scrollView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: buttonViewDividerView.topAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
override func viewDidLayoutSubviews() {
let heightOfAllObjects = scrollView.calculateHeightOfAllObjects()
scrollView.contentSize = CGSize(width: self.view.frame.width, height: heightOfAllObjects + scrollView.heightOfAllPaddings)
}
Run Code Online (Sandbox Code Playgroud)
EventScrollView 中的代码:
addSubview(contentView) …Run Code Online (Sandbox Code Playgroud) 我正在将网络基础更新到 Swift(和 Alamofire)第 5 版。
应该提供“通用响应对象序列化”的一种方法是抛出错误
不能专门化非泛型类型“DataResponseSerializer”
我认为在 Alamofire 5 中,他们使 Type 变得DataResponseSerializer非通用。任何想法如何在最新版本中实现相同的行为?不幸的是,我对 Alamofire 和Generics.
public extension Alamofire.DataRequest {
@discardableResult
func responseDecodableObject<T: Decodable>(completionHandler: @escaping (DataResponse<T>) -> Void) -> Self {
//error is thrown here
let responseSerializer = DataResponseSerializer<T> { request, response, data, error in
guard error == nil else { return .failure(error!) }
let result = DataRequest.jsonResponseSerializer(options: .allowFragments).serializeResponse(request, response, data, error)
switch result {
case .success(let value):
do {
let data = try JSONSerialization.data(withJSONObject: value, options: …Run Code Online (Sandbox Code Playgroud) 我将所有 UIElement 移动到滚动视图中以避免加载 UIViewcontroller。但现在视图上的 GestureRecognizers 不再起作用了。
我的视图层次结构如下所示:
- UIViewController(单事件控制器)
- UIScrollView (EventScrollView)
- UIView(内容视图)
- UILabel、UIView、UITableView 等
这看起来是一个常见问题,因为我在 Stackoverflow 上发现了很多类似的问题: 示例 1 示例 2。尽管如此,我还是没能解决我的案子。
我的EventScrollView中的简化代码如下所示:
let locationLabel: UILabel = {
let label = UILabel()
label.text = "Standort"
label.isUserInteractionEnabled = true //Important!
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.isUserInteractionEnabled = true //not needed!
contentView.isUserInteractionEnabled = true //Important!
}
func setupViews() {
guard let parent = parentVC else { return }
let locationTap = UITapGestureRecognizer(target: parent, action: #selector(parent.openInGoogleMaps))
locationTap.cancelsTouchesInView = false …Run Code Online (Sandbox Code Playgroud) ios ×3
swift ×3
uiscrollview ×2
alamofire ×1
autolayout ×1
constraints ×1
generics ×1
swift5 ×1
uiview ×1