iOS14のUIDatePickerでやたらAutoLayoutのエラーが出てくる

iOS14でUIDatePickerが新しくなったんだけど、これをタップして選択画面を出したタイミングでAutoLayoutのエラーがもりもり出てくる。

f:id:ohnishiakira:20210227201638p:plain
iOS14 UIDatePicker

試した環境

シミュレータの画面サイズによって出たり出なかったりするかな?と思って色々見てみたけどどれも同じだった。

コード

import UIKit

 class ViewController: UIViewController {
     let datePikcer = UIDatePicker()
 
     override func viewDidLoad() {
         super.viewDidLoad()

         view.backgroundColor = .white

         datePikcer.translatesAutoresizingMaskIntoConstraints = false
 
         view.addSubview(datePikcer)
 
         NSLayoutConstraint.activate([
             datePikcer.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
             datePikcer.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor)
         ])
     }
 }

エラー

長すぎるので全体はgistに。

https://gist.github.com/ohnishiakira/02fd577c70d263186212d8c6c98423ec

一番最後の↓がなんかヒントになりそうな気はするが、解決方法は分からずじまい。

2021-02-27 20:05:29.268292+0900 DatePickerSample[4410:161030] [DatePicker] UIDatePicker 0x7ff9e6c20390 is being laid out below its minimum width of 280. This may not look like expected, especially with larger than normal font sizes.

「Effective Ruby」を買った

普段自分が手足のように使っているRubyでも知らない事がまだまだ沢山あるんだな、という事が分かって良かった。

Effective Ruby

Effective Ruby

ガッと開いたページでこの一言を見つけてしまい、すみませんでしたという気持ちになった。

Ruby初心者はmethod_missingの存在を知ると、まるでぜひ使ってくれと言わんばかりの汎用ツールを見つけたとでも思うようだ。(p.115)

RubyGemsで公開されていないgemを使う

自分が作ったgemをRubyGemsにアップする前に使ってみたい、諸事情でRubyGemsでは公開されていない*1、masterブランチのものを直接使いたい、などの理由でgem installでインストールできないgemを使いたい時がある。

今回はMarkdownパーサであるqiita-markdownを使ってみたかったので、このgemをサンプルに書いている。このgemはRubygemsに公開されているので、下記に書いてあるような手順を踏まなくてもふつうにgem installでインストールできる。

ソースコードはあらかじめvendor/以下でgit cloneしてある。

bundlerを使う

Bundlerを使うのが手っ取り早い。Gemfileにgemの名前、置いてある場所を書いてbundle installするだけ。

source "https://rubygems.org"

gem "qiita-markdown", path: "vendor/qiita-markdown", require: "qiita/markdown"

ソースコードの方は下記のようにrequire "bundler"してBundler.requireする。これだけでGemfileに書いてあるgemを呼び出してくれる。便利。

#!/usr/bin/env ruby

require "bundler"
Bundler.require

# ...

bundlerを使わない

なんとなくGemfileを書くのがだるい時がある。そういう時はソースコードから直接requireして済ませる。

大抵のgemはlib以下にrequireすべき対象のファイルが置いてあるため、このlibディレクトリをRuby$LOAD_PATHに追加したあと、通常通りrequireする。

#!/usr/bin/env ruby

$LOAD_PATH.unshift File.expand_path "vendor/qiita-markdown/lib"

require "qiita-markdown"

# ...

*1:社内だけで使っているgemなので公開できないなど