質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

1回答

556閲覧

画像に合わせてUIImageViewを表示させたい(UIImageView角丸表示)

Risney

総合スコア148

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2018/06/20 09:27

編集2018/06/21 20:24

前提・実現したいこと

画像に合わせてUIImageVIEWを表示させたいのですが、
以下のエラーメッセージにより出来ない状態です。

ちなみになぜ画像に合わせたいかというと、
UIImageViewを角丸設定にしたのですが、
画像がUIImageViewより小さくなると
画像が角丸にならないからです。

宜しくお願い致します。

発生している問題・エラーメッセージ

'release' is unavailable: not available in automatic reference counting mode 【翻訳】 'release'は利用できません:自動参照カウントモードでは使用できません

該当のソースコード

objective

1 2#import "ViewController.h" 3 4@interface ViewController () 5 6@property (weak, nonatomic) IBOutlet UIImageView *imageView; 7 8@end 9 10@implementation ViewController 11 12- (void)viewDidLoad { 13 [super viewDidLoad]; 14 // Do any additional setup after loading the view, typically from a nib. 15 16 // //UIImageViewの生成 17 UIImage *image = [UIImage imageNamed:@"mm2"]; 18 // UIImageのサイズを取得 19 CGSize imageSize = image.size; 20 // UIImageViewの生成 21 UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 22 imageView.frame = CGRectMake(0, 0, imageSize.width, imageSize.height); 23 imageView.center = CGPointMake(170, 340); 24 imageView.tag = 10; 25 imageView.contentMode = UIViewContentModeScaleAspectFit; 26 [imageView layer].masksToBounds = YES; 27 [imageView layer].cornerRadius = 10; 28 [self.view addSubview:imageView]; 29 30} 31 32- (void)didReceiveMemoryWarning { 33 [super didReceiveMemoryWarning]; 34 // Dispose of any resources that can be recreated. 35} 36 37@end 38

試したこと

エラーの分を翻訳してみたのですが、
自分の理解力ではわからなかったです。

またはViewいっぱいに画像を表示させる為には
①UIViewContentModeScaleAspectFill
②UIViewContentModeScaleAspectFit
のほうが良いかとは思ったのですが、
①Fillの場合は縦長画像の場合上としたがはみ出て見れない部分が出てくる
②Fitの場合で例えばViewより画像の幅が短いとViewを角丸にしても
画像は角丸にならない

という問題点が出てきました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/06/21 00:26

質問のコードだと、UIImageViewのサイズは画像のサイズと同じになるので、「はみ出て見れない部分が出てくる」とか「Viewより画像の幅が短い」ということにはならないと思うのですが。
Risney

2018/06/21 07:07 編集

はい。なのでエラーメッセージにより出来ない状態です。と質問致しました。そこに対する回答をいただければ幸いです。
fuzzball

2018/06/21 07:11

ちょっと何を言っているのかよく分からないのですが、_Kentarouさんの回答にある「[imageView release];を削除」で解決ということでしょうか?
Risney

2018/06/21 08:16

質問させて頂いたコードではエラーが出てビルドが出来ませんという意味ですが、それは質問内容の上部の2行にある通りです。角丸にならなくなってしまったので今回のコードを書いたのですが、エラーになりましたどうしたらよいですか?という質問に対して、「質問のコードだと角丸にならないと思うのですが」という回答を求めていたのではなく、_Kentarouさんの回答のようにエラーに対してどうすべきかの回答が欲しかったので解決済です。ありがとうございました。
guest

回答1

0

ベストアンサー

現在はメモリ管理を自分で行う(MRC)ことが必要でないので、自分で開放している以下の処理を削除すればエラーは出なくなります。

[imageView release];

UIImageのサイズは取得できますので、そちらからUIImageViewのサイズを決めてあげればよいと思います。
※画像が大きい場合等リサイズが必要な場合があると思いますが、、、

#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UIImage *image = [UIImage imageNamed:@"mm2"]; // UIImageのサイズを取得 CGSize imageSize = image.size; // UIImageViewの生成 UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; imageView.frame = CGRectMake(0, 0, imageSize.width, imageSize.height); imageView.center = CGPointMake(160, 240); imageView.tag = 10; [self.view addSubview:imageView]; } @end

回答追記

画面の幅にから20pxづつ控えられたサイズで画像の幅を固定して、その比率に合わせて高さを計算して画像をリサイズして、最後に角丸にするコードを書いてみました。
※ 幅を基準にしているので横長の画像は大丈夫ですが、縦長の画像だと下にはみ出す可能性があります、あとは好きなように調整してください。

参考にしてみてください。

// ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @end @interface UIImage (Additional) - (UIImage*) btk_ImageResized : (CGSize)size; @end
// ViewController.m #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CGFloat imageMargin = 20; CGFloat width = [UIScreen mainScreen].bounds.size.width - imageMargin * 2; UIImage *image = [UIImage imageNamed:@"mm2"]; CGFloat imageWidth = image.size.width; CGFloat imageHeight = image.size.height; CGFloat w = width / imageWidth; CGFloat h = imageHeight * w; // 画像リサイズ UIImage * resizeImage = [image btk_ImageResized:CGSizeMake(width, h)]; //UIImageViewの生成 UIImageView *imageView = [[UIImageView alloc] initWithImage: resizeImage]; imageView.frame = CGRectMake(20, 100, width, h); imageView.contentMode = UIViewContentModeScaleAspectFit; [self.view addSubview:imageView]; [imageView layer].masksToBounds = YES; [imageView layer].cornerRadius = 10; } @end @implementation UIImage (Additional) - (UIImage*) btk_ImageResized : (CGSize)size { if(CGSizeEqualToSize(self.size, size) && self.imageOrientation == UIImageOrientationUp){ // No need to resize nor convert orientation return self; } UIGraphicsBeginImageContext(size); @try { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetInterpolationQuality(context, kCGInterpolationHigh); [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; return UIGraphicsGetImageFromCurrentImageContext(); } @finally { UIGraphicsEndImageContext(); } } @end

投稿2018/06/20 22:07

編集2018/06/21 20:49
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Risney

2018/06/21 08:20

回答ありがとうございます!!! お陰様でエラーはなくなりビルドすることが出来ました!! 付随して質問なのですが、 画像サイズが大きい場合のリサイズは画像自体のサイズを変更しなくてはならないのでしょうか? またはコードでどうにかできるののなのでしょうか? (別スレのほうがよければ別で質問致します。) _Kentarouさんのコードのおかげ様で画像は表示されたもののはみ出してる状況です。
_Kentarou

2018/06/21 11:34

アスペクト比がImageViewの比とあっていればAspectFitにすれば良いですよ。それでImageViewのサイズぴったりになります。 はみ出すのであれば???? [imageView layer].masksToBounds = YES; [imageView layer].cornerRadius = 10; リサイズするなら???? https://qiita.com/tomohisaota/items/d074ea381a0eead16152
Risney

2018/06/21 20:15 編集

まとめさせて頂きますと_Kentarouさんが最初に組んだコードは 「画像サイズを取得してそれに合わせてImageViewの大きさを指定」そして 「現段階で画像が大きいのではみ出しているのであれば下記2行を追加」 [imageView layer].masksToBounds = YES; [imageView layer].cornerRadius = 10; という事だと思うのですが 上記2行を追加しても画像ははみ出したままなのですが、 入れる場所がおかしかったのででしょうか? [self.view addSubview:imageView]; の上に2行追加したのですが… 認識として上記の2つのコードは 「アスペクト比とImageViewの比を合わせる」ということで良いでしょうか? でもそうだとするとその行為は最初の時点で画像のサイズを取得して それに合わせてImageViewの大きさを指定しているので無意味なのではないでしょうか? 質問が多くて申し訳ないです。 再確認ですがゴールとしては、 ①画像の大きさとアスペクト比率=ImageViewの大きさとアスペクト比率 ②シュミレーターの画面よりすこし小さめにしてはっきり角丸が確認できるようにする ③どの機種でもセンターに表示される(例えばiphone8でもiphoneSEでもiPadでも) の3点で、現時点で画像の上下にスペースはあるのですが、 横が入りきっていない状態なので アスペクト比を維持したまま横幅も画面に収まるように小さくして、 それが他の機種でも適用できるようにしたいのです。 しかし画像サイズにImageViewを合わせてしまうと、 ストーリーボードでImageViewのサイズの制約をかけても無駄ということですよね? そして下記のコードはすべての機種でセンター表示させるには不向きですよね?! imageView.center = CGPointMake(160, 240); ちなみに現在iPhone8で表示させておりますが、 iPhone8plusで表示させると画像全体表示され、 角丸ですがセンターではない状態です。 長文失礼しました。
_Kentarou

2018/06/21 20:10 編集

imageView.backgroundColor = [UIColor redColor]; で背景に色をつけてみてください。角丸にはなっていると思いますが? はみ出さないコードを書いているので、はみ出しているの意味がちょっとわかりませんが、????をつけたらどうでしょう? imageView.contentMode = UIViewContentModeScaleAspectFit;
Risney

2018/06/21 20:18

????返事の文章編集しました! imageView.contentMode = UIViewContentModeScaleAspectFit; はつけてあります! しかし横幅がはいりきっていない為に角も表示されない状況です。
_Kentarou

2018/06/21 20:22

> しかし横幅がはいりきっていない為に角も表示されない状況です。 横幅は入っていて、上下に空白が空いている、そしてその空白の部分が角丸になっているので角丸に見えないということではないでしょうか? 背景色をつけたら角丸になりませんでしたか?
Risney

2018/06/21 20:26

画像をいれさせていただきました! 横幅がはいってないので角丸も表示されてないのです。 もの画像はもう少し横幅があるので上の返答文でも書かせて頂いたのですが、 iphone8plusですと全体が表示されて角丸になっています。
_Kentarou

2018/06/21 20:33

ん? はみ出しているとは、ImageViewの幅が画面に収まっていないということですか?
_Kentarou

2018/06/21 20:50

回答に追記しました。
Risney

2018/06/21 20:58

ありがとうございます!!!!!!!! すべてのiPhoneすすべての機種で真ん中に角丸表示されるようになりました!!!!! しかしIpad系はなぜか下の部分だけ切れている状態です。 でもIpad向けに表示するものではないので問題はありませんがご報告までに!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問