UiTableView 在 ViewController ios 上出现在错误的位置
UiTableView appearing in wrong place on ViewController ios
我目前正在开发一个应用程序,当按下一个按钮时,它会在按钮所在的那个按钮上以模态方式呈现一个视图控制器。这工作正常并且出现在正确的位置,但是,模态视图控制器包含一个 UiTableView 并且它似乎出现在视图控制器的左上角,而不是我在情节提要中放置它的地方。我尝试添加所有约束,如下图所示,但没有成功。当我添加约束时,tableview 根本没有出现。
希望有人能帮助我,因为我已经走到了尽头。
谢谢
杰米
好的,看起来你 UI 是使用故事板制作的。没关系,但您应该知道还有另一种创建 UI 元素(tableView、按钮等)的方法:以编程方式。
因为您使用了故事板,您可能忘记了 check/uncheck 其中的某些设置可能会导致您遇到的问题,我可能无法轻易诊断出您的问题。因此,我将向您展示如何以编程方式解决此问题。
以编程方式
您可以在您尝试呈现的 viewController 中以编程方式设置 tableView 的约束。
因此,如果您要显示的 viewController 名为 viewController
,而您的 tableView 为 tableView
,您应该具有以下内容:
class viewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
/* First, tell XCode that you want to manually set the tableView's constraints using AutoLayout */
tableView.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(tableView)
/* setup constraints for your tableView */
tableView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
tableView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
}
}
创建包含 tableView 的 viewController 的另一种(更简单)方法是简单地从 UITableViewController
继承 viewController inherit而不是 UIViewController
。这是一个简洁的小继承技巧,您可以使用它来使您的代码更加简洁并避免编写不需要编写的代码。如果您继承自 UITableViewController
,您会自动在 viewController 内部获得一个 "free" tableView,而无需创建一个新的:
class viewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
通常,如果我们只打算在其中包含一个 UI 元素:一个 tableView,我们会从 UITableViewController
继承一个 viewController。另一方面,如果我们想在我们的 viewController 中有一个更复杂的布局(比如一个 tableView 只占用 viewController 的一部分,而 space 的其余部分被占用通过其他 UI 元素),那么我们可能希望 viewController 从 UIViewController
继承,然后在其中创建一个 tableView(就像我向您展示的第一个示例)。
故事板
使用情节提要时,您应该确保做对的第一件事是使用 AutoLayout 为 tableView 设置约束。在main.storyboard中,到你要展示的view,点击tableView。然后,将鼠标悬停在 "Align" 按钮上,就在这里:
确保同时选中 "Horizontally in Container" 和 "Vertically in Container"。这会使您的 tableView 在其 superView 中居中。
然后,同样修改如下:
确保选中 "Constraint to margins" 选项。这将 tableView 的边距限制到它的 superView(理想情况下)。
我目前正在开发一个应用程序,当按下一个按钮时,它会在按钮所在的那个按钮上以模态方式呈现一个视图控制器。这工作正常并且出现在正确的位置,但是,模态视图控制器包含一个 UiTableView 并且它似乎出现在视图控制器的左上角,而不是我在情节提要中放置它的地方。我尝试添加所有约束,如下图所示,但没有成功。当我添加约束时,tableview 根本没有出现。
希望有人能帮助我,因为我已经走到了尽头。
谢谢 杰米
好的,看起来你 UI 是使用故事板制作的。没关系,但您应该知道还有另一种创建 UI 元素(tableView、按钮等)的方法:以编程方式。
因为您使用了故事板,您可能忘记了 check/uncheck 其中的某些设置可能会导致您遇到的问题,我可能无法轻易诊断出您的问题。因此,我将向您展示如何以编程方式解决此问题。
以编程方式
您可以在您尝试呈现的 viewController 中以编程方式设置 tableView 的约束。
因此,如果您要显示的 viewController 名为 viewController
,而您的 tableView 为 tableView
,您应该具有以下内容:
class viewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
/* First, tell XCode that you want to manually set the tableView's constraints using AutoLayout */
tableView.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(tableView)
/* setup constraints for your tableView */
tableView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
tableView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
}
}
创建包含 tableView 的 viewController 的另一种(更简单)方法是简单地从 UITableViewController
继承 viewController inherit而不是 UIViewController
。这是一个简洁的小继承技巧,您可以使用它来使您的代码更加简洁并避免编写不需要编写的代码。如果您继承自 UITableViewController
,您会自动在 viewController 内部获得一个 "free" tableView,而无需创建一个新的:
class viewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
通常,如果我们只打算在其中包含一个 UI 元素:一个 tableView,我们会从 UITableViewController
继承一个 viewController。另一方面,如果我们想在我们的 viewController 中有一个更复杂的布局(比如一个 tableView 只占用 viewController 的一部分,而 space 的其余部分被占用通过其他 UI 元素),那么我们可能希望 viewController 从 UIViewController
继承,然后在其中创建一个 tableView(就像我向您展示的第一个示例)。
故事板
使用情节提要时,您应该确保做对的第一件事是使用 AutoLayout 为 tableView 设置约束。在main.storyboard中,到你要展示的view,点击tableView。然后,将鼠标悬停在 "Align" 按钮上,就在这里:
确保同时选中 "Horizontally in Container" 和 "Vertically in Container"。这会使您的 tableView 在其 superView 中居中。
然后,同样修改如下:
确保选中 "Constraint to margins" 选项。这将 tableView 的边距限制到它的 superView(理想情况下)。