2013-05-27 96 views
2

我正在處理文檔查看器。文檔顯示在UIScrollView內部,以便它可以滾動和縮放。我需要在文檔周圍畫一個邊框,以便從UIScrollView的背景中可視化地分離它。不能將邊框與文檔放在一起 - 不管縮放比例如何,它都應保持不變的厚度。如何圍繞UIScrollView的內容繪製邊框?

我目前的設置由一個UIScrollView和兩個UIView孩子組成 - 一個用於文檔,另一個用於邊框。我重寫了viewForZoomingInScrollView:返回文檔視圖。我也重寫了layoutSubviews以居中文檔視圖(如果它小於UIScrollView),然後調整其大小並將邊框視圖放置在其後面,以使其看起來像一個框架。當用戶手動滾動和縮放時,這可以正常工作。但是,當我使用zoomToRect:animated:進行編程縮放時,在動畫開始之前調用layoutSubviews,並在文檔視圖稍後趕上時立即調整邊框視圖的大小。

說明:邊框需要緊貼文檔視圖,而不是圍繞UIScrollView本身。

回答

1

最後,我能夠解決動畫縮放問題。我的設置與問題中所述的相同。我只是在我的layoutSubview實施中添加了一些代碼,以檢測任何正在運行的UIScrollView動畫,並將其與類似的動畫匹配以調整邊界大小。

下面是代碼:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    // _pageView displays the document 
    // _borderView represents the border around it 

    . . . 


    // _pageView is now centered -- we have to move/resize _borderView 
    // layers backing a view are not implicitly animated 
    // the following two lines work just fine if we don't need animation 
    _borderView.layer.bounds = CGRectMake(0.0, 0.0, frameToCenter.size.width + 2.0 * 15.0, frameToCenter.size.height + 2.0 * 15.0); 
    _borderView.layer.position = _pageView.center; 

    if (_pageView.layer.animationKeys.count > 0) 
    { 
    // UIScrollView is animating its content (_pageView) 
    // so we need to setup a matching animation for _borderView 

    [CATransaction begin]; 

    CAAnimation *animation = [_pageView.layer animationForKey:[_pageView.layer.animationKeys lastObject]]; 
    CFTimeInterval beginTime = animation.beginTime; 
    CFTimeInterval duration = animation.duration; 

    if (beginTime != 0.0) // 0.0 means the animation starts now 
    { 
     CFTimeInterval currentTime = [_pageView.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
     duration = MAX(beginTime + duration - currentTime, 0.0); 
    } 

    [CATransaction setAnimationDuration:duration]; 
    [CATransaction setAnimationTimingFunction:animation.timingFunction]; 

    // calculate the initial state for _borderView animation from _pageView presentation layer 
    CGPoint presentationPos = [_pageView.layer.presentationLayer position]; 
    CGRect presentationBounds = [_pageView.layer.presentationLayer frame]; 
    presentationBounds.origin = CGPointZero; 
    presentationBounds.size.width += 2.0 * 15.0; 
    presentationBounds.size.height += 2.0 * 15.0; 

    CABasicAnimation *boundsAnim = [CABasicAnimation animationWithKeyPath:@"bounds"]; 
    boundsAnim.fromValue = [NSValue valueWithCGRect:presentationBounds]; 
    boundsAnim.toValue = [NSValue valueWithCGRect:_borderView.layer.bounds]; 
    [_borderView.layer addAnimation:boundsAnim forKey:@"bounds"]; 

    CABasicAnimation *posAnim = [CABasicAnimation animationWithKeyPath:@"position"]; 
    posAnim.fromValue = [NSValue valueWithCGPoint:presentationPos]; 
    posAnim.toValue = [NSValue valueWithCGPoint:_borderView.layer.position]; 
    [_borderView.layer addAnimation:posAnim forKey:@"position"]; 

    [CATransaction commit]; 
    } 

} 

它看起來哈克,但它的工作原理。我希望我沒有反向工程UIScrollView爲了在動畫過程中使一個簡單的邊框看起來不錯...

3

示例代碼:

yourScrollView.layer.cornerRadius=8.0f; 
yourScrollView.layer.masksToBounds=YES; 
yourScrollView.layer.borderColor=[[UIColor redColor]CGColor]; 
yourScrollView.layer.borderWidth= 1.0f; 

不要忘記:#Import <QuartzCore/QuartzCore.h>

+0

邊框必須圍繞內容視圖而不是圍繞滾動視圖本身 – itotsev

+0

@itotsev:沒有問題在所有。你可以在'yourScrollView'處使用'yourContentView'。我只是簡單地給你一個總想法。 – Bhavin

+0

如果我這樣做,當用戶放大'UIScrollView'時,邊框會變得更厚,我希望它與縮放比例無關。 – itotsev

0

進口QuartzCore框架:

#import <QuartzCore/QuartzCore.h> 

現在添加顏色的觀點:

[scrollViewObj.layer setBorderColor:[[UIColor redColor] CGColor]]; 

[scrollViewObj.layer setBorderWidth:2.0f]; 
1

首先您需要將QuartzCore框架導入您的應用程序。 然後導入該.h文件,在哪個類上設置邊框。 是這樣的。

#import <QuartzCore/QuartzCore.h> 

設置邊框。

ScrollView.layer.cornerRadius=5.0f; 
ScrollView.layer.masksToBounds=YES; 
ScrollView.layer.borderColor=[[UIColor redColor]CGColor]; 
ScrollView.layer.borderWidth= 4.0f; 

檢查這一個真的對你有幫助。