How to add UIImageView in UIAlertController?

2020-02-28 17:43发布

I want UIAlertController to present an alert with UIImageView in an ActionSheet. But when I run the application it is terminating.

This is my code:

UIAlertController *alert = [UIAlertController
                                  alertControllerWithTitle:@"Title"
                                  message:@"Welcome"
                                  preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okButton = [UIAlertAction
                            actionWithTitle:OK
                            style:UIAlertActionStyleDefault
                            handler:^(UIAlertAction *action)
                            {
                            }];
[alert addAction:okButton];
UIImageView *imgv = [[UIImageView alloc]initWithFrame:CGRectMake(20,20,50,50)];
imgv.image = [UIImage imageNamed:@"kaga.jpg"];
[alert setValue:imgv forKey:@"image"];
[self presentViewController:alert animated:YES completion:nil];

3条回答
可以哭但决不认输i
2楼-- · 2020-02-28 18:20

change this:

UIImageView *imgv=[[UIImageView alloc]initWithFrame:CGRectMake(20,20,50,50)];
    imgv.image=[UIImage imageNamed:@"kaga.jpg"];
    [alert setValue:imgv  forKey:@"image"];

to this:

UIImage *img= [UIImage imageNamed:@"kaga.jpg"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    [alert setValue:img  forKey:@"image"];
查看更多
贼婆χ
3楼-- · 2020-02-28 18:23

It is not possible to add an image to a UIAlertController according to Apple Doc.

if you want then you can create your own custom view like:

https://github.com/wimagguc/ios-custom-alertview

If you want to take image appear on button then Try like this:

UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Title"
                              message:@"Welcome"
                              preferredStyle:UIAlertControllerStyleActionSheet];

UIAlertAction* okButton = [UIAlertAction actionWithTitle:@"OK"
                            style:UIAlertActionStyleCancel
                            handler:^(UIAlertAction * action) {
                              //Do some thing here
                            }];

[okButton setValue:[[UIImage imageNamed:@"kaga.jpg"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];

[alert addAction:okButton];
[self presentViewController:alert animated:YES completion:nil];
查看更多
我欲成王,谁敢阻挡
4楼-- · 2020-02-28 18:24

You could add an image above the title label by subclassing UIAlertController and adding \n to the title string to make space for the UIImageView. You'd have to compute the layout based on the font size. For images in the UIAlertAction use KVC like so: self.setValue(image, forKey: "image"). I would recommend to use an extension that checks for responds(to:).

Here is sample implementation.

enter image description here

extension UIAlertAction {

    /// Image to display left of the action title
    var actionImage: UIImage? {
        get {
            if self.responds(to: Selector(Constants.imageKey)) {
                return self.value(forKey: Constants.imageKey) as? UIImage
            }
            return nil
        }
        set {
            if self.responds(to: Selector(Constants.imageKey)) {
                self.setValue(newValue, forKey: Constants.imageKey)
            }
        }
    }

    private struct Constants {
        static var imageKey = "image"
    }
}
查看更多
登录 后发表回答