放流作業

ネットの海に放流するのでいつか戻ってきてほしい

Windows Terminal(Preview)でコピー&ペースト

注意

これは2019年8月14日時点の記事です。まだPreview版なのですぐ仕様が変更される可能性があります。

環境:Windows Terminal (Preview) 0.3.2171.0

コピペができない

Windowsコマンドライン(cmd)ではコピペは通常のctrl+c,ctrl+vででき、WSLを実行中などでもctrl+shift+c,ctrl+shift+vで可能なのですが、Windows Terminalは標準でコピペがブロックされています。

なぜ

ctrl+cはWindowsではコピーのコマンドですが、Linux(他でも?)ではSIGINTシグナルを送信してプロセスを終了するという役割を持っています。なのでコマンドが被らないため無効にされていたんですね。

解決法

しかしコピペできないのは不便(面倒)です。と思ったらissueで色々議論されていました。

github.com

結論からすれば v0.3.2142.0 から設定できるようになったみたいです。

github.com

ということで設定していきます。

Windows Terminal→上の「∨」みたいなところ→設定

or Ctrl+,

でprofiles.jsonが開かれます。その中のglobals > keybindingsに以下を追加します。

{
    "globals" : 
    {
        //略
        "keybindings" : 
        [
            //略

            {
                "command" : "copy",
                "keys" :
                [
                    "ctrl+shift+c"
                ]
            },
            {
                "command": "paste",
                "keys": [
                    "ctrl+shift+v"
                ]
            }
        ],
        //略
    },
 //略
}

 keysの部分は好きなショートカットでOKです。これを保存すればコピペができるようになります(再起動必要なし)。

AndroidのScrollViewで一番下までスクロールできない現象

問題

コンテンツを全て表示させる目的でScrollViewを使うことは多いと思います。

しかし

のように書くと

下までスクロールできずCardViewが切れてしまいます。

なんなのか

いろいろ試してみたところ、事象としてはCardViewの上のmarginの分下が切れているように思われます。ScrollViewのスクロール長さの決定にChildのmarginは含まれていない...?

marginを0にすると問題は起こりません

解決策

LinearLayoutで中身をラップする

しっかり下のmarginまで表示されました。

 

後記

ドキュメントを見ると

A view group that allows the view hierarchy placed within it to be scrolled. Scroll view may have only one direct child placed within it. To add multiple views within the scroll view, make the direct child you add a view group, for example LinearLayout, and place additional views within that LinearLayout.

 

developer.android.com

とあるので、childが一つならラップしなくてもいいはずなんですが...

 

SampleはGitHubに上げています。

github.com

FlutterでGrid

Flutterを触っていたところ、Xamarin.Formsに見られるような比率でレイアウトできるGridが見つからなかったので、作り方をメモしておきます。

作り方

LayoutBuilderでWidgetのサイズを取得し、RowとColumnを使って配置をしています。

ソース

class LayoutBuilderSample extends StatelessWidget{
	@override
	Widget build(BuildContext context) {
		return new LayoutBuilder(
			builder: (BuildContext context, BoxConstraints constraints)
			{
				Size size = new Size(constraints.maxWidth,constraints.maxHeight);
				return new Column(
				  children: <Widget>[
				    new Row(
				    	children: <Widget>[
				    		new SizedBox(
				    			height: size.height/4,
				    			width: size.width/3,
				    			child: new Card(color: Colors.blue),
				    		),
				    		new SizedBox(
				    			height: size.height/4,
				    			width: size.width/2,
				    			child: new Card(color: Colors.greenAccent),
				    		),
				    		new SizedBox(
				    			height: size.height/4,
				    			width: size.width/6,
				    			child: new Card(color: Colors.orange),
				    		),
				    	],
				    ),
				    new Row(
					    children: <Widget>[
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/4,
							    child: new Card(color: Colors.blue),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/3,
							    child: new Card(color: Colors.greenAccent),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/12*5,
							    child: new Card(color: Colors.orange),
						    ),
					    ],
				    ),
				    new Row(
					    children: <Widget>[
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/3*2,
							    child: new Card(color: Colors.blue),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/5,
							    child: new Card(color: Colors.greenAccent),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/15*2,
							    child: new Card(color: Colors.orange),
						    ),
					    ],
				    ),
				    new Row(
					    children: <Widget>[
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/6,
							    child: new Card(color: Colors.blue),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/3,
							    child: new Card(color: Colors.greenAccent),
						    ),
						    new SizedBox(
							    height: size.height/4,
							    width: size.width/2,
							    child: new Card(color: Colors.orange),
						    ),
					    ],
				    ),
				  ],
				);
			},
		);
  }
}

f:id:Nageler:20180504233356p:plain:w200

それぞれのSizedBoxでheightとwidthが全体の大きさの何分の何なのかを指定し、大きさを決めています。子の合計の幅が親を超えるとエラーが出るので注意が必要です。

全体のコードはGitHubにあげておきます。
github.com

Xamarin.iOSのAsset Catalogが反応しない件について

 Xamarin.iOSでアプリのアイコンを設定しようとプロジェクトにMedia.xcassetsを追加しても、デバッグしたときにアイコンが結びついていないことがあります。

f:id:Nageler:20180402170204p:plain

 写真のようにInfo.plistにはちゃんと結びつけているのですが…

解決策

 エクスプローラーでInfo.plistを開いて編集します。中身はXMLで書かれているので、下の方に書いてある

 <key>XSAppIconAssets</key>
<string>Resources/Media.xcassets/AppIcons.appiconset</string>

 のところがxcassetsの正しい場所を示すようにします。私の場合はResourcesフォルダにMedia.xcassetsが入っておらず、Info.plistと同階層にあったため

 <key>XSAppIconAssets</key>
<string>Media.xcassets/AppIcons.appiconset</string>

に変えたところ、アイコンが認識されるようになりました。

 

 

 これはバグなんだろうか…

Azure Mobile Apps Quick StartをXamarin.Formsで行う時

AzureのMobile Apps Quick StartをXamarin.Formsでやろうと思った時、

すごい量のエラーが出ることがあります。

アセンブリ参照が古いためにこれが起こるため、

ソリューションエクスプローラーのソリューション○○を右クリック→ソリューションのNuGetパッケージの管理から

アセンブリを更新するとエラーが消えると思います。

Xamarin.FormsのTabbedPageでタブの位置によってtitleを変える

TabbedPageのCurrentPageChangedを使えばいいんですね。

public MainPage()
{
InitializeComponent();

this.Title = this.CurrentPage.Title;

this.CurrentPageChanged += MainPage_CurrentPageChanged;
}

private void MainPage_CurrentPageChanged(object sender, EventArgs e)
{
this.Title = this.CurrentPage.Title;
}