くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

HTMLとCSSで文字入りの円を描く

最近、ReactNativeやionicやTypeScriptなどでフロント言語を久々に使っています。

なので、基礎的なことですが、定期的にこういう感じのものもブログに書こうかと思います。

今回は円についてです。

まずは単純な円

きれいな円を描くためには高さと幅を同じにして、border-radiusを50%にすればできます。

HTML

<div class="circle"></div>

CSS

.circle {
   width: 50px;
   height: 50px;
   background-color: red;
   border-radius: 50%;
}

楕円にする場合はwidthheightを違う値にすれば実現できます。

次に円の中に文字を入れてみよう

文字を入れる方法は単純で、HTMLのタグの間に文字を入れてしまえばいいのです。

こうすれば、円が移動しても文字も移動してくれるので、余計な心配がいりません。

HTML

<div class="circle">テスト</div>

CSS

.circle {
  // 文字の色
  color: #fff;
  background-color:red;
  border-radius: 50%;
  width: 100px;
  height: 100px;
  // 行間(文字の大きさ+上下の余白→これで高さの中央に配置される
  line-height: 100px;
  text-align: center;
}

ちなみに

今回は<div>タグで作りましたが、<span>タグもしくは<å>タグで作る場合は、CSSのdisplayプロパティの初期値がinlineです。

display: inlineでは、widthheightを指定しても適用されませんので、display: inline-blockにする必要があります。

ここで、ちなみにをもう一つ!

CSSで円を移動させる場合も<div>タグ<span>タグもしくは<å>タグではプロパティを変えないといけません。

HTML

<div class="circle_div">テスト</div>

<div class="parent">
  <span class="circle_span"></span>
</div>

CSS

.circle_div {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  margin: 10px auto;
}

.circle_span{
  display: inline-block;
  width: 50px;
  height: 50px;
  border-radius: 50%;
}

<div>タグの場合はmargin: ××px autoで中心に来るようにします。

一方、<span>タグもしくは<å>タグの場合は、親要素に対してtext-align:centerを指定することで中央寄せができます。

小ネタですが、ブログにまとめていると、知識や思考が整理できるので、これからも小ネタでも書いていきマッスル

参照

CSSでの円の作り方と、その上下左右中央に文字を表示する方法

CSSで円を描く方法:文字を中央配置するには?枠線のつけ方は?

iOS13のアップデート対応してみた

最近もっぱらiOS13対応をしているので、まとめてメモしたいと思います。

①モーダル表示の変更

最初に一番驚いたのがこれです。

かなり中途半端になっていて、下の画面が少しみえます。

しかも、前面に出ている画面を下げると下の画面が表示されます。これだと、遷移時に更新とかするのに大変です。

Appleはこういうモーダル構成に今後していきたいということですかね?

f:id:kumaskun:20200113141248p:plain

これに関しては、UIModalPresentationStyleにautoが追加され、デフォルトのモードがautoとなっていることで発生しています。(今まではfullScreenがデフォルトでした)

なので、fullScreenにすれば問題ないはずです。

viewController.modalPresentationStyle = .fullScreen

もしくは、stroryboardで設定している場合は変更すればいいはずです。

f:id:kumaskun:20200113142003p:plain

②Segemetの変更

iOS13ではUISegmentedControlの見た目が変更されます。

今まではtintColorを使っていましたが、tintColorに依存しなくなったので、色を設定していてもデフォルトに戻ります。

これは、selectedSegmentTintColorを使うことで変更できます。

文字の色を変更する場合は下記のようにしないといけません。

// 選択されている場合の文字の色
 setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .selected)
// 選択されていない場合
 setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], for: .normal)

また、選択されていない場合の背景色がグレーになっているかと思いますが、これは背景が単色のimageを設定すれば解消されます。(文字の色と合わない場合があるので)

// 背景に単色画像を設定
setBackgroundImage(UIColor.clear.toImage(), for: .normal, barMetrics: .default)
setBackgroundImage(UIColor.red.toImage(), for: .selected, barMetrics: .default)

この場合はtintColorを設定していても.normal.selected両方の設定がないと反映されません。(むしろtintColorはいらない気がします)

③FontのBoldが変更

iOS13でBoldが以前より少し太くなっています。

これによって、ラベルがはみ出したり、全て表示されないといことがあるので、幅を広げたりする必要性がありそうです。(太字を直せるか微妙なところだし、そもそも新しい太字で進めるべきな気がしてきた...)

④ハイライトの条件変更

UITableViewCell選択時にcontentView及びそのサブビューのbackgroundColorまたはisOpaqueプロパティが変更されなくなり、contentView 及びそのサブビューに不透明な backgroundColor を設定している場合には影響を受けてハイライト表示されなくなります。

ハイライトさせたいビューの backgroundColornilまたはclearに設定すれば解決します。

解決しない場合には追加でisOpaquefalseにすればいけるはず!

⑤UISearchBarの機能追加

UISearchBarのUISearchTextFieldクラスが追加され、検索エリアの背景色が指定できます。

var searchBar = UISearchBar()
searchBar.searchTextField.backgroundColor = .systemOrange
searchBar.searchTextField.textColor = .systemPurple

ついでに、色に.system○○○○も追加されました。

Light / Dark でいい感じにに変わるみたいです。

今のところこんな感じですが、まだまだあります。(ダークモードとか)

そこまで大幅な修正はあまりなさそうですが、2020年4月までにXcode11で開発しないといけないため、そろそろ開発し始めないといけなさそうですね。

参照

iOS13対応をまとめてみた

iOS 13における必須対応について

iOS13でUISegmentedControlの見た目をカスタマイズする

ios13から日本語フォントのboldがより太くなるケース

iOS13 で UITableViewCell をタップしても背景色がハイライトしなくなった

【iOS】iOS13のUISearchBarの新機能を試してみる

XamarinでJarファイルを取り込む

Xamarinで特定のJarファイルを取り込んで、ライブラリを使用したい場合があります。

今回は、取り込む一連の流れを記載しようと思います。

環境はVisual Studioをつかうので、それを元に進めていきます。

①ライブラリ用のプロジェクトの作成

まずは、ライブラリを入れるプロジェクトを作成します。

ここはAndroidStudioと違うところですが、ライブラリ用のプロジェクトを作る必要があるみたいです。

f:id:kumaskun:20200105012134p:plain

プロジェクト作成の際に、バインディングライブラリを選択して、プロジェクトを作成します。

②Jarファイルを入れてビルド

次に、①で作成したプロジェクトにJarファイルを入れて、ビルドします。

Jarsというフォルダがあるはずなので、その配下に取り込むJarファイルを入れます。

余談ですが、JarファイルはInput JarReference Jarsの2種類あって、今回はC#にバインドするので、Reference Jarsにあたるみたいです。

詳細はAboutJars.txtに記載されているので、確認してみるといいかもしれません。

f:id:kumaskun:20200105012658p:plain

Jarファイルを取り込んだら、そのJarファイルを右クリックで、ビルドアクションを選択します。

EmbededJarを選択してください。

その後、プロジェクトをビルドします。

成功すれば奇跡なくらいエラーが出るはず。。。。

私もエラーが出て、苦労しました。。。。。。

よく出るのはThe type or namespace name '×××××' does not exist in the namespace '××××××'みたいな参照できません系のものです。

今回は必要のないクラスだったので、remove-nodeで対処しましたが、果たして良かったのか?(一般的にはそのクラスをpublicにするというものらしいですが、うまくいきませんでした。)

他にもエラーの種類は色々あると思いますが、今回は割愛させていただきます。

Androidのプロジェクトを作成

ビルドが成功したら、Androidのプロジェクトを作成します。

②で作ったプロジェクトをVisual Studioで開いている状態で、ファイル→新しいソリューションを開きます。

テンプレートは必要なものを選択して、アプリ名を決めるとプロジェクトが作成されます。

②で作成したプロジェクトと同じフォルダに作成されれば、成功です。

作成されたプロジェクトの参照フォルダを右クリックし、参照の編集を選択し、②で作成したプロジェクト名を選択して、インポートできるように設定します。

これで、using~でインポートできるようになったと思います。

おそらくというかほぼビルドエラーに時間を食われることになると思うので、覚悟して挑みましょう!

参照

.JAR のバインド

Approaching a Xamarin.Android Bindings Case

2014-08-01 Xamarin でJavaライブラリを使う際のエラー:「アクセシビリティに一貫性がありません。 '(クラス名)' のアクセシビリティは (フィールド名やメソッド名) よりも低く設定されています。 」

2020年を迎えて

新年を迎えて2020年になりました。

一発目は今年の目標でも書こうかと思います。

今年の目標はざっとこんなもんです。

①本業を頑張る

②LTをする

③技術同人誌を書く

④会社外の人に多く会う

OSSのコミットorライブラリを作る

⑥アプリを継続して作る

①については当たり前ですが、去年転職をしたので、今年はアウトプットをしっかりやりたいと思います。(AndroidiOS開発がメイン)

②、③、⑤、⑥は共通している考えがあり、外部にアウトプットを行いたいと思っています。

さらに、アウトプットのやり方も、話すや書くやコーディングなど、様々な方法で行えればいいと考えています。

その延長で、社外のエンジニアとの交流やエンジニア以外の人とも交流できればいいと思います。

もちろん、ブログやQiitaなどの記事投稿も引き続き行います。

何より楽しく過ごせる1年にしたいと思います!!!

ReactNativeのキャッシュ削除

ブランチ切り替え時に前のブランチの状態で画面が表示されたりするので、削除方法をまとめました。 完全に小ネタですがよく使うと思います。

watchman watch-del-all
lsof -n -P -i :8081 -t | xargs kill
rm -rf ios/build
rm -rf android/app/build
rm -rf node_modules
npm install

さらにiOSでビルドできない場合は以下も有効な場合があります。React Native自体のバージョンアップ時など。

rm -rf ~/Library/Developer/Xcode/DerivedData

テンプレートでデータを使い回す

Angularのng-templateを使うときのメモです。

Angularとはいいながらも、ionicとかでも使います。(私はionicでなんだこれと思いながら調べてここに行き着きました)

わざわざ新しいコンポーネントを定義するほどではないけど、同じテンプレートの中で一定の記述を使い回したい時に使います。

<!-- 使いまわしたい記述を ng-template で宣言 -->
<ng-template #testTemplate let-test="test">
 <p> {{ text }} </p>
</ng-template>

<!-- テンプレートを ng-container から利用する -->
<ng-container *ngTemplateOutlet="testTemplate; context:{ test: 'aaaa' }"></ng-container>
<ng-container *ngTemplateOutlet="testTemplate; context:{ test: 'bbbb' }"></ng-container>

ng-containerタグの部分は以下になります。

 <p> aaaa</p>
 <p> bbbb</p>

ng-contenerでは *ngTemplateOutletによって、テンプレートと、contextを指定します。 context はテンプレートで使用する変数になります。

ng-templateは context から受け取る変数をlet-{context内のプロパティ}=変数名で宣言し、内部で利用できます。

あとは、<ng-container>のcontextの値を変えてHTMLに記載すれば使い回すことができます。

この方法だとTypescriptなど内部の処理を変更しないので、恐怖感はないかと思います。笑

参照

Angular > テンプレート内で、テンプレートを参照する。(ng-containerでng-templateを参照)

iOS13にアップデートする際の注意点【ReactNative編】

ReactNativeのiOSプロジェクトをアップデートした際にエラーが発生しました。 今回は小ネタですが解決方法をメモしたいと思います。

iOSのアップデートのため、xcodeのバージョンを11.1にしました。 特にソースコードのエラーは発生しなかったので、シュミレーターで試してみると以下のエラーが発生しました。

Unknown argument type 'attribute' in method

以下の部分を

static BOOL RCTParseUnused(const char **input)
{
 return RCTReadString(input, "__unused") ||
     RCTReadString(input, "__attribute__((unused))");
}

以下のように変更すると解決できます。

static BOOL RCTParseUnused(const char **input)
{
 return RCTReadString(input, "__unused") ||
     RCTReadString(input, "__attribute__((__unused__))") ||
     RCTReadString(input, "__attribute__((unused))");
}

バージョンアップのエラー解決は場合によってはかなり骨の折れる作業になりますが、今の所このエラーだけなので、ラッキーと思いながら、他の部分を確認しています。

もし他にあれば、追記したいと思います。

参照

stack overflow

TypeScriptでプロパティがHTMLElementで値が存在しないというエラーを解消する

こんなエラーです。

<select  id= "test">
    <option value= test1>test1</option>
    <option value= test2>test2</option>
    <option value= test3>test3</option>
</select>

上記の選択値を取得するときにdocument.getElementById("test").valueで取得しようとすると、エラーが発生しました。

メッセージはこのようなものです。

The property ‘test' does not exist on value of type 'HTMLElement'

document.getElementById(‘hoge’);の戻り値は、HTMLElement型で、この型のインターフェースにはvalueプロパティは存在しないようです。

document.getElementByIdは、HTMLElement型または null を返します。 このとき、受け取り側は HTMLInputElement 型であるため、エラーが発生しています。

こう解決します!

HTMLInputElementというHTMLElementを継承したインターフェースには、valueプロパティが存在するので、こちらに型変換すれば良さそうです。

const element: HTMLInputElement =<HTMLInputElement>document.getElementById(‘test');
const value: string = element.value;

これで、valueで値を取得できます。

JavaScriptではエラーは発生しないはずですが。。。。

違いはもう少し勉強する必要がありますね。

参照

HTMLElementのリファレンス

HTMLInputElementのリファレンス