AutoLayout對 scrollview的contentSize 和contentOffset屬性的影響

 

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裏。

  1. -(void)viewDidAppear:(BOOL)animated
  2. {
  3. [super viewDidAppear:animated];
  4. [_scrollView setContentSize:CGSizeMake(500, 1800)];
  5. }

 

關於網上不少博客寫着「結構體類型裏面的某個屬性若是想要修改是不容許單個修改的」 之解釋:

其實並非說結構體的成員就必定不能單個修改,例如在某方法中單獨定義一個結構體類型的臨時變量,是能夠對它的成員直接進行修改的。

只是結構體在做爲OC對象的屬性使用時,OC語法規定不能單獨對結構體屬性的單個成員進行修改,要改必須經過對對象的結構體屬性總體賦值,這樣作也確保數據的完整性。

相關文章
相關標籤/搜索