2014-09-25 64 views
4

我有一個非常簡單的UIView,那只是畫一個三角形。它實現了一個繪製數字的方法UIView drawRect。它在iOS7上工作正常,但是當我在iOS8上運行相同的代碼時,它甚至沒有被調用。任何想法在iOS8上發生了什麼變化?我在一言以蔽之代碼:iOS8問題 - UIView drawRect不叫

@interface MyView : UIView 
@end 

@implementation MyView 
- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     self.backgroundColor = [UIColor clearColor]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    // draw things 
} 
@end 

myView = [MyView new]; 
[self addSubview:myView]; 

更新
我的看法層次:UIViewController View->Custom UILabel->MyView

這是一個錯誤信息泡沫,而我的觀點是指向一個東西喙。

我已經使用了一個新的UI調試工具,但它在那裏不可見。 Init方法被調用,drawRect不是。 iOS8中一定有變化,因爲iOS7叫drawRect

更新2
當然,我使用的限制(和Masonry POD),這就是爲什麼我沒有指定的幀。

[myView mas_makeConstraints:^(MASConstraintMaker *make) { 
    make.top.equalTo(make.superview.mas_bottom); 
    make.centerX.equalTo(make.superview); 
    make.width.equalTo(@10.0f); 
    make.height.equalTo(@5.0f); 
}]; 

我也試過在各個地方加入[myView setNeedsDisplay],但沒有幫助。

+1

有關視圖層次結構中引入視圖的更多信息?您是否使用新的調試工具檢查了視圖層次結構,以查明您的視圖在哪裏? – Vinzzz 2014-09-25 12:20:35

+0

@Vinzzz更新了問題。如果您需要更多信息,請告訴我。 – KlimczakM 2014-09-25 12:31:49

+0

好的...所以你使用這個MASConstraintMaker ...也許iOS 8的bug來自那個類? – Vinzzz 2014-09-25 14:21:07

回答

2

問題終於解決了。我不確定究竟是什麼導致了問題(Masonry [約束框架]或iOS8更改爲UILabel),但解決方案是更改視圖層次結構。我創建了另一個UIView,其中包含UILabel和我的UIView(繪製的喙),而不是將UIView添加到UILabel作爲子視圖。現在在iOS7和iOS8上調用drawRect方法。

上一個層次:
UIViewController View->Custom UILabel->MyView

新的層次結構:
UIViewController View->Container UIView->Custom UILabel & MyView

綜上所述,如果你的drawRect方法不叫上iOS8上,且要添加一些UIViewUILabel作爲子視圖,嘗試使用包含UIViewUILabel的容器。

0

您的方法中缺少一個重要細節。您需要指定一個框架來確定視圖的來源和大小。這可以通過的initWithRect方法完成,也可以在分配/初始化後設置幀。既然你有一個自定義init方法已經我會做到以下幾點:

myView = [MyView new]; 
myView.frame = CGRectMake(0.0,0.0,100.0,100.0); 
[self addSubview:myView]; 

這將吸引你的自定義視圖與(0.0,0.0)的原點和100.0的寬度和高度。

此外,添加調用setNeedsDisplay應該強制drawRect方法被調用,如果你仍然有問題:

[myView setNeedsDisplay]; 
+0

感謝您的回覆。我當然使用約束,所以我的代碼中沒有框架。對不起,忘了寫這個。已經更新了這個問題。 – KlimczakM 2014-09-25 12:53:14

+0

您可能想要嘗試調用[self.view layoutSubviews]以確保您的約束正在被正確處理和渲染。 – dgangsta 2014-09-25 13:06:16

0

確保myView的上海華物業clipToBounds = NO,那myView矩形是在屏幕上