你需要這個
-(CGRect) unobscuredBounds
{
CGRect bounds = [self.view bounds];
return UIEdgeInsetsInsetRect(bounds, [self defaultContentInsets]);
}
-(UIEdgeInsets) defaultContentInsets
{
const CGFloat topOverlay = self.topLayoutGuide.length;
const CGFloat bottomOverlay = self.bottomLayoutGuide.length;
return UIEdgeInsetsMake(topOverlay, 0, bottomOverlay, 0);
}
你可以把這個在category獲得可複用性。
這些方法可以正確處理視圖在旋轉後調整大小時發生的更改 - 正確處理對UINavigationBar大小的更改。
圍繞內容
用這個來centre content by adjusting insets,你會做這樣的事情:
-(void) scrollViewDidZoom:(UIScrollView *)scrollView
{
[self centerContent];
}
- (void)centerContent
{
const CGSize contentSize = self.scrollView.contentSize;
const CGSize unobscuredBounds = [self unobscuredBounds].size;
const CGFloat left = MAX(0, (unobscuredBounds.width - contentSize.width)) * 0.5f;
const CGFloat top = MAX(0, (unobscuredBounds.height - contentSize.height)) * 0.5f;
self.scrollView.contentInset = UIEdgeInsetsMake(top, left, top, left);
}
你的內容的插圖現在將反映他們所需要的默認插圖(爲了避免被掩蓋)並且還會有它們需要很好地居中的插頁。
處理旋轉&放大
你可能也想進行橫向和縱向之間的動畫時定心。同時,您可能需要調整最小縮放比例,以便始終適合您的內容。嘗試是這樣的:
-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[self centerContent];
const bool zoomIsAtMinimum = self.scrollView.zoomScale == self.scrollView.minimumZoomScale;
self.scrollView.minimumZoomScale = [self currentMinimumScale];
if(zoomIsAtMinimum)
{
self.scrollView.zoomScale = self.scrollView.minimumZoomScale;
}
}
-(CGFloat) currentMinimumScale
{
const CGFloat currentScale = self.scrollView.zoomScale;
const CGSize scaledContentSize = self.scrollView.contentSize;
const CGSize scrollViewSize = [self unobscuredBounds].size;
CGFloat scaleToFitWidth = currentScale * scrollViewSize.width/scaledContentSize.width;
CGFloat scaleToFitHeight = currentScale * scrollViewSize.height/scaledContentSize.height;
return MIN(scaleToFitWidth, scaleToFitHeight);
}
的willAnimateRotationToInterfaceOrientation:…
方法是在觀看動畫塊中調用,所以它適用當你從橫向切換到肖像將導致很好的流暢的動畫變化的變化。