Установка цвета фона подкласса UIView не работает - PullRequest
6 голосов
/ 28 декабря 2011

Я пытаюсь изменить цвет фона одного из моих подклассов UIView.По какой-то причине self.backgroundColor = [UIColor whiteColor]; ничего не делает, когда я помещаю это в мой метод - (id)initWithFrame:(CGRect)frame внутри представления.Вид всегда черный.Я также пробовал self.myView.backgroundColor ... с контроллера моего представления, но это тоже не сработало.Есть идеи, что я делаю не так?

Соответствующий код выглядит так:

[...]
@interface PaperView : UIView
[....]

[...]
@implementation PaperView
[...] 

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [...]
        // Initialization code        
        self.backgroundColor = [UIColor whiteColor]; // This doesn't do anything, the view is always black.
    }
    return self;
}

Ответы [ 7 ]

7 голосов
/ 09 июля 2015

У меня была такая же проблема. Я подключился к layoutSubviews() и все заработало нормально:

override func layoutSubviews() {
    super.layoutSubviews()
    self.backgroundColor = UIColor.clearColor()
}
7 голосов
/ 29 декабря 2011

Если это представление разархивировано из xib, вам нужно переопределить -initWithCoder:. -initWithFrame: вызывается только в том случае, если вы создаете представление программно.

3 голосов
/ 28 декабря 2011

Это указывает на то, что вид не имеет установленного кадра.Я рекомендую установить точку останова в вашем initWithFrame:, чтобы убедиться, что она вызывается.Если вы позвоните, скажем, ... = [UIView alloc] init], то это может стать источником вашей проблемы.

РЕДАКТИРОВАТЬ

Если на самом деле вызывается initWithFrame:, возможно, что представление закрывается другим представлением, создающим видимость того, что оно не работает (поскольку вы его не видите) или само представление скрыто.

Еще один способ устранения неполадок - переопределитьСвойство backgroundColor и установить точку останова.Узнайте, что еще в стеке вызовов меняет цвет.

1 голос
/ 28 декабря 2011

В каком методе вы вызываете self.myView.backgroundColor? Вы уверены, что это после viewDidLoad:? Но понятия не имею, что не так с вашим первым методом. Не могли бы вы показать больше кода?

0 голосов
/ 26 января 2017

Вы можете использовать self.layer.backgroundColor вместо:

mySubclassedView.layer.backgroundColor = UIColor.green.cgColor
0 голосов
/ 10 марта 2014

У меня только что была точно такая же проблема .Цвет фона не отображался, хотя я установил правильный кадр и установил белый цвет фона в моем пользовательском методе инициализации, а также в моем методе viewWillAppear.Я также проверил, что ничто не покрывало это.

Затем я нашел решение : вместо этого я установил цвет фона viewDidAppear, и все было в порядке:

- (void)viewDidAppear:(BOOL)animated
{
   [self.view setBackgroundColor:[UIColor whiteColor]];
   self.view.frame = _viewFrame;
}

(_viewFrame CGRect былпередается моему методу init.)

Другой вариант - установить его в - (void)viewDidLayoutSubviews, в зависимости от того, когда и как именно вы хотите установить цвет фона.

Если быть полностью честным,Я не понимаю (пока), почему установка цвета фона в viewDidAppear работала, пока он не работал в методе init, и код для его установки был одинаковым в обоих местах.

Надеюсь, это поможет,

Эрик


ОБНОВЛЕНИЕ: Это как-то связано с рамкой вида .Когда я устанавливаю рамку моего вида в моем методе init, тогда установка цвета фона в viewDidAppear больше не дает желаемого эффекта.Это даже в том случае, если я установил фрейм моего представления после моего метода построения представления, который создает вложенные представления.Таким образом, настоящая загадка: между точкой, в которой я закончил создание моего представления, и точкой, где он отображается, что в жизненном цикле представления заставляет кадр представления быть сброшенным к чему-то неправильному?

Итак, ответ на самом деле таков: он будет работать до тех пор, пока ваш фрейм установлен правильно и ваш видимость видна.Просто проверяйте рамку вашего представления на протяжении жизненного цикла представления, чтобы убедиться, что оно правильное.

Tricky ...

0 голосов
/ 29 декабря 2011

Почему вы не можете реализовать метод self.backgroundColor = [UIColor whiteColor] в -viewDidLoad вместо -initWithFrame? Затем попробуйте self.backgroundColor = [UIColor whiteColor];, а также self.myView.backgroundColor, чтобы увидеть, что работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...