リンク付きNSTextField[Mac][C#][Xamarin][Uno Platform]

最近、Macアプリの開発を頼まれていまして。
ずーーーーーーっとApple社を避けてきたので、やりたくない。

が、仕方がないので、アプリ上にリンク付きでライセンス表示をしたい。
完成イメージはこんな感じ。

リンク付きテキストの設定方法はすぐ見つかった。
けど、タップした瞬間、フォントサイズが変わっちゃうんだよね。
なので、フォントサイズも指定します。

まず、XcodeでNSTextFiledクラスオブジェクトにtxtLicenceの名をつけておく。

txtLicence.UsesSingleLineMode = false;
txtLicence.Editable = false;
txtLicence.Selectable = true;

string linkStringDisp = "ライセンスの表示";
string linkStringApache = "Apache-2.0";
string baseString = "System.Buffers" + Environment.NewLine
                    + linkStringDisp + Environment.NewLine
                    + "System.Collections.Immutable" + Environment.NewLine
                    + linkStringDisp + Environment.NewLine
                    + "System.Memory" + Environment.NewLine
                    + linkStringDisp + Environment.NewLine
                    + "System.Runtime.CompilerServices.Unsafe" + Environment.NewLine
                    + linkStringDisp + Environment.NewLine
                    + "Uno.Diagnostics.Eventing" + Environment.NewLine
                    + linkStringApache + Environment.NewLine
                    + "Uno.Foundation.Logging" + Environment.NewLine
                    + linkStringApache + Environment.NewLine
                    + "Uno.SourceGenerationTasks" + Environment.NewLine
                    + linkStringApache + Environment.NewLine
                    + "Uno.UI" + Environment.NewLine
                    + linkStringApache + Environment.NewLine;
string[] urls = new string[] {
    "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT",
    "https://licenses.nuget.org/MIT",
    "https://github.com/dotnet/corefx/blob/master/LICENSE.TXT",
    "https://licenses.nuget.org/MIT",
};
var attr = new NSMutableAttributedString(baseString);
int pos = -1;
// ライセンス表示にリンクを挿入
for (int i = 0; i < urls.Length; i++)
{
    pos = baseString.IndexOf(linkStringDisp, pos + 1);
    attr.AddAttribute(NSStringAttributeKey.Link, NSString.FromObject(urls[i]), new NSRange(pos, linkStringDisp.Length));
}
// Apache-2.0にリンクを挿入
while(true)
{
    pos = baseString.IndexOf(linkStringApache, pos + 1);
    if(pos == -1)
    {
        break;
    }
    attr.AddAttribute(NSStringAttributeKey.Link, NSString.FromObject("http://www.apache.org/licenses/LICENSE-2.0"), new NSRange(pos, linkStringApache.Length));
}

// 選択時にフォントサイズが小さくなるので、選択前と同じフォント設定を設けておく
attr.AddAttribute(NSStringAttributeKey.Font, txtLicence.Font, new NSRange(0, baseString.Length));

txtLicence.AttributedStringValue = attr;

これでタップしてもフォントサイズが変わらないライセンス表示ができました。


他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。

返信を残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)