如何在iPhone应用程序中创建自定义UIAlertView

6

我有一个iPhone应用程序,点击按钮时应该打开一个自定义警报视图,显示一些文本和右上角带有“X”交叉符号的窗口,就像我们在任何Web应用程序中都有的灯箱一样。


你想定制UIalertView的按钮吗? - Saad
是的,我想要自定义它们以适应边框外,并且看起来像网站中的弹出视图。 - james
从您的问题中无法清楚地了解您的需求。您是想在按钮单击时打开一个视图,并且该视图具有左上角的关闭按钮。那么您不必使用alertview,只需使用具有设计的视图并在视图加载时隐藏它,在buttonclick中取消隐藏即可...就这样,很酷。 - hacker
5个回答

2

@jamil 如果我的版本低于6怎么办? - Saranjith

1

这正是为什么给定的示例子类化了UIView的原因。 - marika

1

如果您想要实现自定义警告视图,那么您应该使用这个示例代码,它具有非常吸引人的警告视图集合,并借助ViewController进行操作。 请尝试此示例代码链接 https://github.com/eaigner/CODialog


0

在ReturnAlert.xib中创建自定义视图

enter image description here

class ReturnView: UIView, UITextFieldDelegate {


}

class ReturnAlert: UIAlertController {
   var returnView: ReturnView?

   public convenience init(id message: String?) {
      self.init(title: nil, message: "message", preferredStyle: .alert)

      guard let view = UINib(nibName: "ReturnAlert", bundle: Bundle(for: ReturnView.self)).instantiate(withOwner: ReturnView.self, options: nil)[0] as? ReturnView else{
        fatalError("Return view not found")
    }

    self.returnView = view
    view.alert = self
    let parent = self.view.subviews[0].subviews[0]

    for sv in parent.subviews {
        sv.removeFromSuperview()
    }

    view.bounds = CGRect(x: parent.bounds.origin.x, y: parent.bounds.origin.y, width: view.frame.size.width, height: view.frame.size.height)

    parent.addSubview(view)

    let xConstraint = NSLayoutConstraint(item: view, attribute: .centerX, relatedBy: .equal, toItem: parent, attribute: .centerX, multiplier: 1, constant: 0)

    let yConstraint = NSLayoutConstraint(item: view, attribute: .centerY, relatedBy: .equal, toItem: parent, attribute: .centerY, multiplier: 1, constant: 0)

    parent.addConstraint(xConstraint)
    parent.addConstraint(yConstraint)
  }
}

0
- (void)willPresentAlertView:(UIAlertView *)alertView; 
- (void)didPresentAlertView:(UIAlertView *)alertView; 

在上述任何一条消息中,检查子视图及其类并根据您的需要更改值。请参考UIActionSheet的示例代码。使用NSLog搜索所有组件的类并自定义所需的类。这是UIActionSheet的代码。
for (UIView* view in [actionSheet subviews])
    {
        NSLog(@"%@",[view class]);
        if ([[[view class] description] isEqualToString:@"UIAlertButton"] && [view respondsToSelector:@selector(setAlpha:)])
        {
            [view setAlpha:2.0];
            [view setOpaque:YES];
            if ([view respondsToSelector:@selector(title)])
            {
                NSString* title = [view performSelector:@selector(title)];
                if ([title isEqualToString:@"Cancel"] && [view respondsToSelector:@selector(setBackgroundImage:forState:)] && [view respondsToSelector:@selector(setFrame:)] && [view respondsToSelector:@selector(setFrame:)] && [view respondsToSelector:@selector(setTitleColor:forState:)])
                {

                    [view setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
                    [view setBackgroundImage:[UIImage imageNamed:@"btn-cancel.png"] forState:UIControlStateNormal];
                    [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y+10, view.frame.size.width,view.frame.size.height)];

                }
            }
        }
    }

我没有理解,你能再解释一下吗? - james
在iOS上,每个视图都有层级结构。你需要在屏幕上搜索出每个层级,然后查看它所属的类别。例如,警报包含一个标签、一个按钮,而一个按钮又包含一个标签等等。当你找到了目标类别,比如说按钮,那么你就可以改变它的行为。 - Saad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接