簡體   English   中英

設置UIView子類的背景顏色不起作用

[英]Setting background color of UIView subclass doesn't work

我正在嘗試更改我的一個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;
}

我有同樣的問題。 我迷上了layoutSubviews() ,它工作正常:

override func layoutSubviews() {
    super.layoutSubviews()
    self.backgroundColor = UIColor.clearColor()
}

如果要從xib取消歸檔此視圖,則需要覆蓋-initWithCoder: . -initWithFrame:僅在以編程方式創建視圖時才會調用。

這表示視圖沒有設置框架。 我建議在initWithFrame:設置斷點initWithFrame:驗證它是否被調用。 如果您打電話,比如說, ... = [UIView alloc] init] ,那么這可能是您問題的根源。

編輯

如果實際上正在調用initWithFrame:那么該視圖可能會被另一個視圖覆蓋,從而使其看起來不起作用(因為您沒有看到它)或者視圖本身是隱藏的。

另一種排除故障的方法是覆蓋backgroundColor屬性並設置斷點。 找出callstack中正在改變顏色的其他內容。

你用什么方法調用self.myView.backgroundColor? 你確定,它是在viewDidLoad之后:? 但是,不知道你的第一種方法有什么問題。 你能展示更多代碼嗎?

您可以使用self.layer.backgroundColor

mySubclassedView.layer.backgroundColor = UIColor.green.cgColor

你為什么不能執行self.backgroundColor = [UIColor whiteColor]-viewDidLoad方法,而不是-initWithFrame 然后嘗試self.backgroundColor = [UIColor whiteColor]; 以及self.myView.backgroundColor以查看哪些有效。

我剛才遇到了同樣的問題 即使我在自定義init方法中設置了正確的幀並將背景顏色設置為白色,以及在我的viewWillAppear方法中,也沒有顯示背景顏色。 我也證實沒有任何東西覆蓋它。

然后我找到了解決方案 :我在viewDidAppear設置背景顏色,而且一切都很好:

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

_viewFrame CGRect已傳入我的init方法。)

另一種選擇是將其設置在- (void)viewDidLayoutSubviews ,具體取決於您想要設置背景顏色的時間和方式。

說實話,我還不明白為什么在viewDidAppear設置背景顏色雖然在init方法中不起作用,但在兩個地方設置它的代碼是相同的。

希望這可以幫助,

埃里克


更新:它確實與視圖的框架有關 當我在init方法中設置視圖的框架時,在viewDidAppear中設置背景顏色不再具有所需的效果。 這是即使我把我的視圖的框架,創建子視圖我認為構建方法之后的情況。 所以真正的謎團是:在我創建視圖的位置和顯示它的位置之間, 視圖生命周期中的哪些內容會導致視圖的幀重置為不正確的內容?

所以,答案實際上是:只要您的框架設置正確並且您的視圖可見,它就會起作用。 只需在整個視圖的生命周期中檢查視圖的框架,以確保它是正確的。

整蠱......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM