0

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

4

2 回答 2

1

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

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

UILabel.Appearance.BackgroundColor = UIColor.Blue;

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

于 2012-05-01T00:39:02.320 回答
0

这有点骇人听闻,但这可以解决问题,并且它适用于该子类的各种其他 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计数以查看它是否在视图中。

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

于 2012-05-01T14:31:37.950 回答