iOS:大型UIAlertController ActionSheet在滚动时弹跳而不显示行分隔符

时间:2015-10-22 13:54:36

标签: ios swift uiactionsheet uialertcontroller

我有两个问题操作表包含20个选项(大于屏幕高度):

问题1 。滚动时如何禁用垂直反弹?

问题2 。滚动到底部时如何显示行分隔符?

缺少问题2 的行分隔符:

enter image description here

我正在使用Xcode 6.4和iOS 8.4模拟器。我的iPad在iOS 9.0.2上运行相同的代码也存在这两个问题。

我使用UIAlertControllerStyle.ActionSheet创建了一个操作表。我使用addAction在操作表中添加了20个选项。

我的 ViewController .swift如下:

override func viewDidLoad() {
    super.viewDidLoad()

    let button = UIButton(frame: CGRectMake(50, 60, 200, 20))
    button.setTitle("Press", forState: UIControlState.Normal)
    button.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
    button.addTarget(self, action: "btnPressed:", forControlEvents: UIControlEvents.TouchUpInside)
    view.addSubview(button)
}

func btnPressed(sender: UIButton) {
    let controller = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

    for item in 1...20 {
        controller.addAction(UIAlertAction(title: "Option \(item)", style: UIAlertActionStyle.Default, handler: { action in
        }))
    }
    controller.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))

    presentViewController(controller, animated: true, completion: nil)
}

问题1

是否有可以在UITableView中设置的跳出属性:tableView.bounces = false以防止长时间操作表在滚动时出现垂直反弹?

问题2

这与“UIActionSheet is not showing separator on the last item on iOS 7 GM”不同,后者使用已弃用的UIActionSheet而不是UIAlertControllerUIAlertControllerStyle.ActionSheet。在操作表中添加“取消”选项似乎不是解决方案。

如果我在操作表中添加标题或消息或从中删除“取消”选项,则底线分隔符仍然缺失。

是否可以显示这些缺失的行?

1 个答案:

答案 0 :(得分:0)

如果您要在视图中禁用滚动(及其所有子视图),此代码应该可以正常使用。

- (void)disableBouncingInView:(UIView *)view {
    for (UIView *subview in view.subviews) {
        if ([subview respondsToSelector:@selector(setBounces:)]) {
            UIScrollView *scrollView = (UIScrollView *)subview;
            [scrollView setBounces:NO];
        }

        [self disableBouncingInView];
    }
}

并将其称为:

[self disableBouncingInView:myAlertController.view];

修改

我刚看到这个问题被标记为swift,所以在swift中有同样的想法:

func disableBouncingInView(view : UIView) {
    for subview in view.subviews as [UIView]  {
        if let scrollView = subview as? UIScrollView {
            scrollView.bounces = false
        }

        disableBouncingInView(subview)
    }
}

并且这样调用:

        disableBouncingInView(myAlertController.view)