web-dev-qa-db-ja.com

UIAlertControllerにUIImageViewを追加する方法は?

UIAlertControllerUIImageViewを含むアラートをActionSheetに表示させたい。しかし、アプリケーションを実行すると、アプリケーションが終了します。

これは私のコードです:

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];
7
Yasuhiro Kondo

Apple Doc。に従って、UIAlertControllerに画像を追加することはできません。

必要に応じて、次のような独自のカスタムビューを作成できます。

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

buttonに表示される画像を撮りたい場合は、次のようにしてください。

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];
5
Suraj Sukale

UIAlertControllerをサブクラス化し、_\n_をタイトル文字列に追加してUIImageViewのスペースを作ることにより、タイトルラベルの上に画像を追加できます。フォントサイズに基づいてレイアウトを計算する必要があります。 UIAlertAction内の画像の場合は、KVCを次のように使用します:self.setValue(image, forKey: "image")responds(to:)をチェックする拡張機能を使用することをお勧めします。

これがサンプル実装です。

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"
    }
}
_
8
stringCode

これを変える:

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

これに:

UIImage *img= [UIImage imageNamed:@"kaga.jpg"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    [alert setValue:img  forKey:@"image"];
0
Vladimir K