<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 陰影 ????iOS的另一個常見特性呢,就是陰影。陰影往往可以達到圖層深度暗示的效果。也能夠用來強調正在顯示的圖層和優先級(比如說一個在其他視圖之前的彈出框),不過有時候他們只是單純的裝飾目的。 ????給`shadowOpacity`屬性一個大于默認值(也就是0)的值,陰影就可以顯示在任意圖層之下。`shadowOpacity`是一個必須在0.0(不可見)和1.0(完全不透明)之間的浮點數。如果設置為1.0,將會顯示一個有輕微模糊的黑色陰影稍微在圖層之上。若要改動陰影的表現,你可以使用CALayer的另外三個屬性:`shadowColor`,`shadowOffset`和`shadowRadius`。 ????顯而易見,`shadowColor`屬性控制著陰影的顏色,和`borderColor`和`backgroundColor`一樣,它的類型也是`CGColorRef`。陰影默認是黑色,大多數時候你需要的陰影也是黑色的(其他顏色的陰影看起來是不是有一點點奇怪。。)。 ????`shadowOffset`屬性控制著陰影的方向和距離。它是一個`CGSize`的值,寬度控制這陰影橫向的位移,高度控制著縱向的位移。`shadowOffset`的默認值是 {0, -3},意即陰影相對于Y軸有3個點的向上位移。 ????為什么要默認向上的陰影呢?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創建的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了默認的3個點位移的陰影是向上的。在Mac上,`shadowOffset`的默認值是陰影向下的,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5). ![](https://box.kancloud.cn/2015-12-24_567bc1f325c01.png) 圖4.5 在iOS(左)和Mac OS(右)上`shadowOffset`的表現。 ????蘋果更傾向于用戶界面的陰影應該是垂直向下的,所以在iOS把陰影寬度設為0,然后高度設為一個正值不失為一個做法。 ????`shadowRadius`屬性控制著陰影的*模糊度*,當它的值是0的時候,陰影就和視圖一樣有一個非常確定的邊界線。當值越來越大的時候,邊界線看上去就會越來越模糊和自然。蘋果自家的應用設計更偏向于自然的陰影,所以一個非零值再合適不過了。 ????通常來講,如果你想讓視圖或控件非常醒目獨立于背景之外(比如彈出框遮罩層),你就應該給`shadowRadius`設置一個稍大的值。陰影越模糊,圖層的深度看上去就會更明顯(如圖4.6). ![](https://box.kancloud.cn/2015-12-24_567bc1f340a43.png) ## 陰影裁剪 &nbps;???和圖層邊框不同,圖層的陰影繼承自內容的外形,而不是根據邊界和角半徑來確定。為了計算出陰影的形狀,Core Animation會將寄宿圖(包括子視圖,如果有的話)考慮在內,然后通過這些來完美搭配圖層形狀從而創建一個陰影(見圖4.7)。 ![](https://box.kancloud.cn/2015-12-24_567bc1f3624ea.png) 圖4.7 陰影是根據寄宿圖的輪廓來確定的 &nbps;???當陰影和裁剪扯上關系的時候就有一個頭疼的限制:陰影通常就是在Layer的邊界之外,如果你開啟了`masksToBounds`屬性,所有從圖層中突出來的內容都會被才剪掉。如果我們在我們之前的邊框示例項目中增加圖層的陰影屬性時,你就會發現問題所在(見圖4.8). ![](https://box.kancloud.cn/2015-12-24_567bc1f393277.png) 圖4.8?`maskToBounds`屬性裁剪掉了陰影和內容 &nbps;???從技術角度來說,這個結果是可以是可以理解的,但確實又不是我們想要的效果。如果你想沿著內容裁切,你需要用到兩個圖層:一個只畫陰影的空的外圖層,和一個用`masksToBounds`裁剪內容的內圖層。 &nbps;???如果我們把之前項目的右邊用單獨的視圖把裁剪的視圖包起來,我們就可以解決這個問題(如圖4.9). ![](https://box.kancloud.cn/2015-12-24_567bc1f3b642f.png) 圖4.9 右邊,用額外的陰影轉換視圖包裹被裁剪的視圖 &nbps;???我們只把陰影用在最外層的視圖上,內層視圖進行裁剪。清單4.3是代碼實現,圖4.10是運行結果。 清單4.3 用一個額外的視圖來解決陰影裁切的問題 ~~~ @interface ViewController () @property (nonatomic, weak) IBOutlet UIView *layerView1; @property (nonatomic, weak) IBOutlet UIView *layerView2; @property (nonatomic, weak) IBOutlet UIView *shadowView; @end @implementation ViewController ? - (void)viewDidLoad { [super viewDidLoad]; //set the corner radius on our layers self.layerView1.layer.cornerRadius = 20.0f; self.layerView2.layer.cornerRadius = 20.0f; //add a border to our layers self.layerView1.layer.borderWidth = 5.0f; self.layerView2.layer.borderWidth = 5.0f; //add a shadow to layerView1 self.layerView1.layer.shadowOpacity = 0.5f; self.layerView1.layer.shadowOffset = CGSizeMake(0.0f, 5.0f); self.layerView1.layer.shadowRadius = 5.0f; //add same shadow to shadowView (not layerView2) self.shadowView.layer.shadowOpacity = 0.5f; self.shadowView.layer.shadowOffset = CGSizeMake(0.0f, 5.0f); self.shadowView.layer.shadowRadius = 5.0f; //enable clipping on the second layer self.layerView2.layer.masksToBounds = YES; } @end ~~~ ![](https://box.kancloud.cn/2015-12-24_567bc1f3eca19.png) 圖4.10 右邊視圖,不受裁切陰影的陰影視圖。 ### shadowPath屬性 ????我們已經知道圖層陰影并不總是方的,而是從圖層內容的形狀繼承而來。這看上去不錯,但是實時計算陰影也是一個非常消耗資源的,尤其是圖層有多個子圖層,每個圖層還有一個有透明效果的寄宿圖的時候。 ????如果你事先知道你的陰影形狀會是什么樣子的,你可以通過指定一個`shadowPath`來提高性能。`shadowPath`是一個`CGPathRef`類型(一個指向`CGPath`的指針)。`CGPath`是一個Core Graphics對象,用來指定任意的一個矢量圖形。我們可以通過這個屬性單獨于圖層形狀之外指定陰影的形狀。 圖4.11 展示了同一寄宿圖的不同陰影設定。如你所見,我們使用的圖形很簡單,但是它的陰影可以是你想要的任何形狀。清單4.4是代碼實現。 ![](https://box.kancloud.cn/2015-12-24_567bc1f418cfb.png) 圖4.11 用`shadowPath`指定任意陰影形狀 清單4.4 創建簡單的陰影形狀 ~~~ @interface ViewController () @property (nonatomic, weak) IBOutlet UIView *layerView1; @property (nonatomic, weak) IBOutlet UIView *layerView2; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //enable layer shadows self.layerView1.layer.shadowOpacity = 0.5f; self.layerView2.layer.shadowOpacity = 0.5f; //create a square shadow CGMutablePathRef squarePath = CGPathCreateMutable(); CGPathAddRect(squarePath, NULL, self.layerView1.bounds); self.layerView1.layer.shadowPath = squarePath; CGPathRelease(squarePath); ?//create a circular shadow CGMutablePathRef circlePath = CGPathCreateMutable(); CGPathAddEllipseInRect(circlePath, NULL, self.layerView2.bounds); self.layerView2.layer.shadowPath = circlePath; CGPathRelease(circlePath); } @end ~~~ ????如果是一個矩形或者是圓,用`CGPath`會相當簡單明了。但是如果是更加復雜一點的圖形,`UIBezierPath`類會更合適,它是一個由UIKit提供的在CGPath基礎上的Objective-C包裝類。 圖4.6 大一些的陰影位移和角半徑會增加圖層的深度即視感
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看