控制台輸出約束警報,介面完好

2021-09-23 06:06:42 字數 2173 閱讀 4383

發現在使用uitableview控制項時候,self.tableview.tableheaderview = self.viewheader;控制台列印大量的約束衝突,但是介面完好。

uiview *viewtemp = [[uiview alloc] initwithframe:cgrectmake(0, 0, screenwidth, heightuse)];

[viewtemp addsubview:self.viewheader];

[self.viewheader mas_makeconstraints:^(masconstraintmaker *make) ];

self.tableview.tableheaderview = viewtemp;

self.viewheader.frame = cgrectmake(0, 0, screenwidth, heightuse);

self.tableview.tableheaderview = self.viewheader;

self.tableview.tableheaderview一開始尺寸為0.後來設定self.tableview.tableheaderview = self.viewheader;導致runloop的乙個迴圈週期內self.tableview.tableheaderview的尺寸要進行變化。從0變化到self.viewheader的尺寸。

因為self.tableview.tableheaderview = self.viewheader;所以self.tableview.tableheaderview的尺寸變化就反應在了self.viewheader的尺寸變化上。也就是self.viewheader的尺寸從0變化到乙個設定的尺寸。

在self.viewheader的變化中,一開始尺寸為0。這時候我們的布局有可能會有衝突。其實我們布局時候很少甚至不會考慮最底部檢視布局尺寸為0,我們認為永遠不會為0,都在我們的掌控中,但是tableview的頭布局這種尺寸變化特性導致一開始我們的最外層檢視尺寸為0。導致有約束的衝突,這時候控制台列印出了警報,而且可能有很多警告。每個警告中都有類似這種問題,***view.width == 0。「」

這種警告也反應出了父檢視寬度為0 導致約束衝突。當檢視展開後,我們的約束又沒有衝突了,runloop更新ui後其實又沒有問題了,所以這時候介面又變現的很正常。但是其實之前確實是有約束衝突的,控制台也輸出了警告資訊。

看到這裡其實我們知道了原因了。就是我們的自定義的檢視的最外層view尺寸變為了0,這時候我們的view有約束衝突。控制台列印出了約束警告。之後當我們的檢視尺寸展開後又一切正常,ui上也沒任何問題。

可以看出確實self.viewheader的尺寸從0展開。

第一種辦法: 利用優先順序

可以看到我們解決辦法是又新建立了乙個viewtemp,在這個viewtemp上新增我們的self.viewheader。在進行約束,並把優先順序調到900。

這時候一開始self.viewheader尺寸為0,這時候我們的自定義檢視尺寸嘗試去縮小到0。但是發現有約束衝突,由於優先順序較低所以不再進行繼續縮小。當self.viewheader展開後,我們的自定義檢視嘗試去展開,展開後沒有問題。

第二種辦法: 在runloop下乙個迴圈中進行約束

親測這種辦法也可以解決問題。在runloop第乙個迴圈週期內viwetemp的尺寸完成了從0展開。這時候和self.viewheader沒有關係。

在runloop低二個迴圈週期時候完成約束。這時候其實父檢視已經完成了布局的變化,檢視已經完全的展開了,所以self.viewheader也不會受到影響。

推薦:第一種方法

方法二要進行兩次更新ui,如果由於計算錯誤,有可能第一次會看到乙個不正確的ui。所以不推薦這種方法。

當我們遇到控制台列印==""== 的問題。這時候ui介面卻完好。

這時候我們要檢查是不是用的tableview.tableheaderview,如果是,那麼就這樣進行修改試試看吧。

控制台輸出控制

by jingzhongrong 通過win32api提供的函式,可以對控制台程式的輸出進行控制,例如字型顏色 標題文字,以及各種屬性等等。主要使用到的函式以及宣告如下 handle getstdhandle dword nstdhandle 此函式用於獲取控制台輸出 輸入控制代碼。得到控制代碼之後...

控制台介面控制(五) 輸入輸出

c中puts 函式 用來向標準輸出裝置 螢幕 寫字串並換行,其呼叫方式為,puts s 其中s為字串字元 字串陣列名或字串指標 功 能 送一字串到流stdout中 用 法 int puts char string 程式例 include int main void 說明 puts 和 printf ...

讀取控制台輸出

在新建工程窗體中新增button1 memo1 unit unit1 inte ce uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls,extctrls type tfor...