请帮助!:)我在这里是一个巨大的菜鸟。我已经从各种来源收集了此代码,所以我真的不知道自己在做什么。我的警报控制器显示了我可以写入的文本字段,"取消"操作,"确定"操作,并且还显示了标签"标签"操作的多个输入关键字。
它具有太多的操作(我需要的20个关键字动作),以至于它不适合屏幕,它被键盘覆盖,或者在键盘上。它看起来很丑,您无法触摸的一些按钮。有没有办法滚动我的动作以使其适合此空间?
这是我最后一个图像的代码:
//Quality Text Box (9)
@IBOutlet weak var QualityLabel: UILabel!
@IBAction func QualityTapped(_ sender: UIButton) {
print("Quality Button Tapped")
openQualityAlert()
}
func openQualityAlert() {
//Create Alert Controller
let alert9 = UIAlertController (title: "Quality:", message: nil, preferredStyle: UIAlertControllerStyle.alert)
//Create "Keyword -> label" actions
let bt1 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt1)
let bt2 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt2)
let bt3 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt3)
let bt4 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt4)
let bt5 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt5)
let bt6 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt6)
let bt7 = UIAlertAction(title: "Itch", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Itch"}
alert9.addAction(bt7)
let bt8 = UIAlertAction(title: "Burn", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Burn"}
alert9.addAction(bt8)
let bt9 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt9)
let bt10 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt10)
let bt11 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt11)
let bt12 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt12)
let bt13 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt13)
let bt14 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt14)
let bt15 = UIAlertAction(title: "Itch", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Itch"}
alert9.addAction(bt15)
let bt16 = UIAlertAction(title: "Burn", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Burn"}
alert9.addAction(bt16)
let bt17 = UIAlertAction(title: "Abuse", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Abuse"}
alert9.addAction(bt17)
let bt18 = UIAlertAction(title: "Hemmorhage", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Hemmorhage"}
alert9.addAction(bt18)
let bt19 = UIAlertAction(title: "Discomfort", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Discomfort"}
alert9.addAction(bt19)
let bt20 = UIAlertAction(title: "Acute", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Acute"}
alert9.addAction(bt20)
let bt21 = UIAlertAction(title: "Disease", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Disease"}
alert9.addAction(bt21)
let bt22 = UIAlertAction(title: "Rash", style: UIAlertActionStyle.default){
(action) in self.QualityLabel.text = "Rash"}
alert9.addAction(bt22)
//Create Cancel Action
let cancel9 = UIAlertAction(title: "CANCEL", style: UIAlertActionStyle.cancel, handler: nil)
alert9.addAction(cancel9)
//Create OK Action
let ok9 = UIAlertAction(title: "INPUT TEXTFIELD", style: UIAlertActionStyle.default) { (action: UIAlertAction) in print("OK")
let textfield = alert9.textFields?[0]
print(textfield?.text!)
self.QualityLabel.text = textfield?.text!
}
alert9.addAction(ok9)
//Add Text Field
alert9.addTextField { (textfield: UITextField) in
textfield.placeholder = "Quality"
}
//Present Alert Controller
self.present(alert9, animated:true, completion: nil)
}
,尽管我找到了一种滚动到uialertController Action的顶部的方法,
我不建议这样做,因为我不知道您的应用程序是否会被拒绝。
我认为此答案仅与iOS 10
有关self.present(alert, animated: true, completion: {
//print(alert.view) // _UIAlertControllerView
//print(alert.view.subviews) // [UIView]
//print(alert.view.subviews[0].subviews) // [_UIAlertControllerInterfaceActionGroupView]
//print(alert.view.subviews[0].subviews[0].subviews) // [_UIDimmingKnockoutBackdropView, UIView]
//print(alert.view.subviews[0].subviews[0].subviews[0].subviews) // [UIView, UIVisualEffectView]
//print(alert.view.subviews[0].subviews[0].subviews[1].subviews) // [_UIInterfaceActionGroupHeaderScrollView, _UIInterfaceActionItemSeparatorView_iOS, _UIInterfaceActionRepresentationsSequenceView]
// _UIInterfaceActionRepresentationsSequenceView <- This is what we want
// In this view are all your added actions. It is a subview of UIScrollView, so just cast it and set the contentOffset to zero
if let scrollView = alert.view.subviews[0].subviews[0].subviews[1].subviews[2] as? UIScrollView {
scrollView.setContentOffset(.zero, animated: true)
}
})
这可能不起作用,因为我不检查子视图是否按此顺序。
未来的iOS更新也可能完全崩溃此方法。
我也刚刚在iPhone上测试了这一点。我不知道它在iPad上是否有效。
或多或少安全的方法(欢迎建议):
self.present(alert, animated: true, completion: {
guard alert.view.subviews.count >= 1 else { return }
guard alert.view.subviews[0].subviews.count >= 1 else { return }
guard alert.view.subviews[0].subviews[0].subviews.count >= 2 else { return }
guard alert.view.subviews[0].subviews[0].subviews[1].subviews.count >= 3 else { return }
if let scrollView = alert.view.subviews[0].subviews[0].subviews[1].subviews[2] as? UIScrollView {
scrollView.setContentOffset(.zero, animated: true)
}
})
这会找到卷轴并滚动到顶部。我们搜索所有子视图,因为多个子视图对setContentOffset响应,但不要打扰检查哪一个。
- (void)methodThatCreatesTheAlertController
{
// make the alertController here, add actions, and then...
[self presentViewController:alertController animated:YES completion:^{
[self scrollToTopOfAlertControllerView:alertController.view];
}];
}
- (void)scrollToTopOfAlertControllerView:(UIView *)view
{
for ( UIView *aSubview in view.subviews ) {
if ( [aSubview respondsToSelector:@selector(setContentOffset:animated:)] ) {
// _UIInterfaceActionGroupHeaderScrollView
// _UIInterfaceActionRepresentationsSequenceView <-- this is the one that scrolls
[((UIScrollView *)aSubview) setContentOffset:CGPointZero animated:YES];
}
[self scrollToTopOfAlertControllerView:aSubview]; // recurse
}
}
使用此代码设置您的AlertController类
https://gist.github.com/petrpavlik/0c5feaada5913cafde8a