AutoLayout對 scrollview的contentSize 和contentOffset屬性的影響
問題1、iOS開發中,若是在XIB文件中建立一個scrollview,同時給它設置佈局限制,而後在viewDidload方法設置它的contentSize,仍然不能滾動?
應該就是勾選了AutoLayout選項致使的。由於在AutoLayout下,iOS計算scrollview的contentsize的機制是略有不一樣的。
在AutoLayout下,會在viewDidAppear以前根據subview的constraint從新計算scrollview的contentsize。 這就是爲何,在viewDidload裏面手動設置了contentsize沒用。由於在後面,會再從新計算一次,前面手動設置的值會被覆蓋掉。佈局
解決辦法有如下三種:
1.去除AutoLayout選項,本身手動設置contentSize。如 self.scrollView.contentSize = CGSizeMake(1200, 1200);spa
2.若是要使用AutoLayout,要麼本身設置完subview的constraint,而後讓系統自動根據constraint計算出contentSize。對象
如 self.scrollView.contentSize = self.imgView.frame.size;教程
3.要麼就在viewDidAppear裏面本身手動設置contentsize。ci
另外,設置scrollView的初始偏移量contentOffset也會受到AutoLayout影響,在viewDidLoad中設置的偏移量,因受AutoLayout影響,在viewDidAppear方法中會被歸(0,0),此問題見如下代碼,可參考以上3種方法進行解決。開發
- (void)viewDidLoad {博客
[super viewDidLoad];it
NSLog(@"viewDidLoad");class
//設置scrollciew內容大小變量
self.scrollView.contentSize = self.imgView.frame.size;
//在viewDidLoad中作一次偏移(在viewDidAppear方法中,偏移會被歸0)
[self printOffset];
self.scrollView.contentOffset = CGPointMake(-200, -200); //結構體做爲屬性時必須總體賦值,不能夠單個修改結構體成員(這是OC的規定)
[self printOffset];
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:YES];
NSLog(@"viewDidAppear");
//在viewDidAppear中作一次偏移((但在viewDidAppear方法中,偏移會被歸0))
[self printOffset];
CGPoint origin = CGPointMake(-100, -100);
self.scrollView.contentOffset = origin; //結構體做爲屬性時必須總體賦值,不能夠單個修改結構體成員(這是OC的規定) [self printOffset];
}
打印結果以下:
2016-04-08 12:20:07.181 6.0 UIScrollView經常使用屬性[874:61590] viewDidLoad
2016-04-08 12:20:07.182 6.0 UIScrollView經常使用屬性[874:61590] offset: {0, 0}
2016-04-08 12:20:07.182 6.0 UIScrollView經常使用屬性[874:61590] offset: {-200, -200}
2016-04-08 12:20:07.257 6.0 UIScrollView經常使用屬性[874:61590] viewDidAppear
2016-04-08 12:20:07.257 6.0 UIScrollView經常使用屬性[874:61590] offset: {0, 0}
2016-04-08 12:20:07.257 6.0 UIScrollView經常使用屬性[874:61590] offset: {-100, -100}
問題2、iOS開發: 解決UIScrollView不滾動的問題
照着書上的Demo(iOS 5.0的教程),在- (void)viewDidLoad裏設置scrollView的contentsize,讓它大於屏幕的高度,卻發如今模擬器中沒用,仍是不能滾動。通過一翻搜索發現,這是由於iOS 6.0中新增的AutoLayout機制引發的,viewDidLoad後,AutoLayout會再一次把scrollView的contentSize設爲屏幕的寬高,因此,咱們的設置就無效了。
解決方法:把設置ContentSize的代碼放到viewDidAppear裏。
- -(void)viewDidAppear:(BOOL)animated
- {
- [super viewDidAppear:animated];
- [_scrollView setContentSize:CGSizeMake(500, 1800)];
- }
關於網上不少博客寫着「結構體類型裏面的某個屬性若是想要修改是不容許單個修改的」 之解釋:
其實並非說結構體的成員就必定不能單個修改,例如在某方法中單獨定義一個結構體類型的臨時變量,是能夠對它的成員直接進行修改的。
只是結構體在做爲OC對象的屬性使用時,OC語法規定不能單獨對結構體屬性的單個成員進行修改,要改必須經過對對象的結構體屬性總體賦值,這樣作也確保數據的完整性。