現在開発中のアプリにてcell.imageView
に画像を表示しております。
そこで一つご相談があります。
動作確認動画
https://i.gyazo.com/b56962c53afd63efa06b2e3c1c041722.mp4
問題点
動作確認動画にもあるようにセルをタップすると画像の大きさが変動してしまう。
実装コード
//セルを構築する際に呼ばれるメソッド
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //RSSで取得したニュースの値が入る let newsItem = joySelectionArray[indexPath.row] //セルのスタイルを設定 let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell" ) //サムネイルのインスタンス(画像URL, 待機画像, 画像キャッシュ) let thumbnailURL = URL(string: joySelectionArray[indexPath.row].image!.description) let placeholder = UIImage(named: "placeholder") //サムネイルの反映 cell.imageView?.kf.setImage(with: thumbnailURL, placeholder: placeholder, options: [.transition(.fade(0.2))]) //サムネイルのサイズを統一(黄金比) cell.imageView?.image = cell.imageView?.image?.resize(_size: CGSize(width: 130, height: 80)) //セルを化粧 cell.backgroundColor = UIColor.white cell.textLabel?.text = newsItem.title cell.textLabel?.font = UIFont.systemFont(ofSize: 15.0, weight: .medium) cell.textLabel?.textColor = UIColor(hex: "333") cell.textLabel?.numberOfLines = 2 //空のセルを削除 tableView.tableFooterView = UIView(frame: .zero) //インスタンス作成 let dateFormatter = DateFormatter() //フォーマット設定 dateFormatter.dateFormat = "yyyy'年'M'月'd'日('EEEEE') 'H'時'm'分's'秒'" //ロケール設定(日本語・日本国固定) dateFormatter.locale = Locale(identifier: "ja_JP") //タイムゾーン設定(日本標準時固定) dateFormatter.timeZone = TimeZone(identifier: "Asia/Tokyo") //Date型 → string型 let pubDateString = dateFormatter.string(from: Date()) //セルのサブタイトル cell.detailTextLabel?.text = pubDateString cell.detailTextLabel?.textColor = UIColor.gray return cell } //セルをタップした時呼ばれるメソッド override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { //タップ時の選択色の常灯を消す tableView.deselectRow(at: indexPath as IndexPath, animated: true) //WebViewControllerのインスタンス作成 let webViewController = WebViewController() //WebViewのNavigationControllerを定義 let webViewNavigation = UINavigationController(rootViewController: webViewController) //WebViewをフルスクリーンに webViewNavigation.modalPresentationStyle = .fullScreen //タップしたセルを検知 let tapCell = joySelectionArray[indexPath.row] //検知したセルのurlを取得 UserDefaults.standard.set(tapCell.url, forKey: "url") //webViewControllerへ遷移 present(webViewNavigation, animated: true) }
extension UIImage { //比率を保持してリサイズ func resize(_size: CGSize) -> UIImage { let widthRatio = _size.width / self.size.width let heightRatio = _size.height / self.size.height let ratio = (widthRatio < heightRatio) ? widthRatio : heightRatio let resizedSize = CGSize(width: (self.size.width * ratio), height: (self.size.height * ratio)) UIGraphicsBeginImageContextWithOptions(_size, false, 0.0) draw(in: CGRect(x: (_size.width - resizedSize.width) / 2, y: (_size.height - resizedSize.height) / 2, width: resizedSize.width, height: resizedSize.height)) let resizedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resizedImage ?? self; } }
仮説と対応
・仮説
→ 明確にサイズを指定していなかった為、指定する必要があると仮説。
・仮設に対する対応
→ 実装コードにもあるようにextensionを扱ってサイズを統一した。
仮設検証
状況は変わらず。ただ、タップする以前のサイズは意図したサイズに指定することができた。
もし分かる方がいらっしゃいましたらご協力のほどよろしくお願いいたします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。