タイトルバーの色合いを設定する方法と、すべてのビューの背景画像を設定する方法を理解しましたが、私の人生では、セクションヘッダーなどのデフォルトのUILabelの色を設定する方法を理解できません。すべての色をUIColor.Blackに手動で設定するコードをなぞなぞしたくありません。さまざまなUIElementのリストを取得する方法と、それぞれのデフォルト(色、フォント、サイズ)を設定する方法はありますか?ラベルの色に特に興味がありますが、他の情報は将来に非常に役立ちます。
2 に答える
iOS 5以降UIAppearance
、多くのUI要素のグローバルな外観を処理するクラスがあります。
MonoTouchで機能する方法は、と呼ばれる内部タイプAppearance
がこれらのタイプに存在することです。そこからプロパティを直接設定できます(MonoDevelopのコード補完で簡単に)。例えば
UILabel.Appearance.BackgroundColor = UIColor.Blue;
残念ながら、すべてのコントロールに必要なすべてを網羅しているわけではありません(iOS 5より前では機能しません)。
これは一種のハッキーですが、これでうまくいき、サブクラスの他のあらゆる種類のUIコントロールで機能しUIView
ます。これは、あなたがあなた自身のサブクラスを持っていることを前提としていますDialogViewController
(私のものにはたくさんの便利な時間節約のものがあり、私のすべてのビューは私のDVCをサブクラス化して仕事をします)。
protected void ForAllSubviewUIControlsOfType<TUIType>(Action<TUIType, int> actionToPerform) where TUIType : UIView
{
processSubviewUIControlsOfType<TUIType>(this.View.Subviews, actionToPerform, 0);
}
private void processSubviewUIControlsOfType<TUIType>(UIView[] views, Action<TUIType, int> actionToPerform, int depth) where TUIType : UIView
{
if (views == null)
return;
if (actionToPerform == null)
return;
foreach (UIView view in views)
{
if (view.GetType () == typeof(TUIType))
{
actionToPerform((TUIType)view, depth);
}
if (view.Subviews != null)
{
foreach (UIView subview in view.Subviews)
{
processSubviewUIControlsOfType<TUIType>(view.Subviews, actionToPerform, depth + 1);
}
}
}
}
元の問題を解決し、セクションにあるすべてのラベルのテキストの色を変更するには、次のことを行う必要があります。
public override void ViewDidAppear (bool animated)
{
base.ViewDidAppear (animated);
ForAllSubviewUIControlsOfType<UILabel>((label, depth) => {
if ( /*label.Superview is UIView && label.Superview.Superview is UITableView*/ depth == 1 )
{
label.TextColor = UIColor.Black;
}
});
}
コメントアウトされた部分は、ラベルがセクション内に存在するかどうかを判断するためのものであり、int depth
それがビューにあるかどうかを確認するためにカウントを返すことにしました。
編集:これは完璧な解決策ではないようです...深度カウントはこれらの要素によって異なります。翌日か2日でもっと良いものを見つけなければなりません。