【问题标题】:Set default UILabel color for whole application in Monotouch在 Monotouch 中为整个应用程序设置默认 UILabel 颜色
【发布时间】:2012-04-30 13:54:09
【问题描述】:

我已经知道如何设置标题栏的色调并为我的所有视图设置背景图像,但对于我来说,我无法弄清楚如何设置节标题等的默认 UILabel 颜色.我不想让我的代码手动将我的所有颜色设置为 UIColor.Black。有没有办法获取不同 UIElements 的列表以及为每个元素设置默认值(颜色、字体、大小)的方法?我对标签的颜色特别感兴趣,但任何其他信息都会对未来非常有帮助。

【问题讨论】:

  • 你能继承UILabel,并在那里设置你的“默认”标签吗?这样,您只需在整个代码(或 XIB 文件)中使用子类。
  • 我正在使用 Monotouch.Dialog,所以我看不到控制这些元素的方法,除非我要从程序集视图复制源代码并创建自己的类。如果我找不到在一个地方更改标签颜色的方法,我正在考虑这条路线。
  • 详细地说,我将拥有自己的 DDRootElement、DDSection 等,可以将这些标签设置为我选择的任何颜色。

标签: c# xamarin.ios monotouch.dialog


【解决方案1】:

从 iOS 5 开始,有一个 UIAppearance 类来处理许多 UI 元素的全局外观。

它与 MonoTouch 一起工作的方式是在这些类型上存在一个名为 Appearance 的内部类型。您可以直接从中设置属性(使用 MonoDevelop 的代码完成很容易)。例如

UILabel.Appearance.BackgroundColor = UIColor.Blue;

遗憾的是,它并没有涵盖您可能想要的每个控件的所有内容(在 iOS 5 之前它也不会工作)。

【讨论】:

  • 遗憾的是,它只允许您更改背景颜色,而不是前景色。不过,我找到了一个解决方法,我稍后会发布。
【解决方案2】:

这有点骇人听闻,但这可以解决问题,并且它可以与 UIView 子类的各种其他 UI 控件一起使用。这假设你有自己的子类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 计数以查看它是否在视图中之前,注释掉的部分是确定标签是否存在于部分中的部分。

编辑:似乎这不是完美的解决方案……深度计数因这些元素而异。我必须在接下来的一两天内找到更好的办法。

【讨论】:

    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 2012-02-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    相关资源
    最近更新 更多