self.frame.size = CGSizeMake(self.frame.size.width, lastHeight);
這樣寫沒法通過編譯嵌纲,編譯器會報錯"expression is not assignable"
原因是班巩,這句話里面的幾個點有兩種不同的含義钙勃。self.view.frame是Objective-C語法旭愧,是讀取view屬性的frame屬性,在Objective-C中使用點來訪問屬性只是一種語法糖慈参,所以self.view.frame這句話會被轉(zhuǎn)換成:
[[self view] frame]
而frame屬性是一個CGRect結(jié)構(gòu),所以frame.size.height
是C語言的語法刮萌,就是訪問CGRect結(jié)構(gòu)中的size字段驮配。所以,你這句話實際上等于:
[[self view] frame].size = CGSizeMake(self.frame.size.width, lastHeight);
而Objective-C只是對C語言的一個擴展着茸,所以壮锻,上面這句話會被轉(zhuǎn)成C語言的函數(shù)調(diào)用形式,類似于這種形式:
getframe().size = CGSizeMake(self.frame.size.width, lastHeight);
而在C語言里涮阔,函數(shù)的返回值是一個R-Value猜绣,是不能直接給它賦值的(所謂的R-Value,就是只能出現(xiàn)在等號的右邊敬特,你可以理解成是一個常量掰邢;而可以被賦值的是L-Value,可以出現(xiàn)在等號的左邊擅羞,通常是變量)尸变。因此,當你打算直接給函數(shù)的返回值賦值的時候减俏,編譯器告訴你"這個表達式無法被賦值"召烂。這就是這個錯誤的出現(xiàn)原因。
所以娃承,解決辦法就是奏夫,用一個臨時變量保存這個函數(shù)的返回值,修改這個臨時變量历筝,然后再賦給frame:
CGRect frame = self.frame;
frame.size.height = lastHeight;
self.frame = frame;
最后一步調(diào)用的是setFrame:方法酗昼。