18996


【解決済みです】  
Xcode7.1・swiftを用いたios向けアプリケーションの練習中として、[こちら](http://lab.spec5zigen.com/archives/calayer/)のサイト冒頭の「左右がジワっと消える」UIScrollViewを制作したいと思い、コード制作・苦戦しておりました。

[英語版stackOverFlowに似たような質問](https://stackoverflow.com/questions/12091998/how-
to-mask-a-uiscrollview)がありましたので、参考にしました。  
UIViewにマスクを施し、その中でUIScrollViewを動かす事で、UIScrollViewの状態に関係無くマスクをかける事に成功しました事をお伝え致します。

作成していたUIScrollViewは、0~9までの画像(元500x500を80x80にしたもの)をダイヤルのようにグルグルとループさせる文です。

参考までに、作成したマスクのコードを置いておきます。

[code]

    (maskUIView.swift)
    import UIKit
    class maskUIView: UIView {
        override func drawRect(rect: CGRect) {
            let maskImg : UIImage = UIImage(named: "whitemask.png")!
            let mask : CALayer = CALayer()
            mask.contents = maskImg.CGImage
            mask.frame = CGRectMake(0, 0, 160, 80)
            self.layer.mask = mask
        }
    }
    
[/code]

storyboardでUIViewを配置し、上記を関連付け、その後storyboardでUIScrollViewをUIViewの上にドラッグ＆ドロップしてUIViewの中で動くようにしました。

ご回答ありがとうございました。


CC BY-SA 3.0
2015-11-18T09:23:58.613
18990
2015-11-18T16:17:33.997
2017-05-23T12:38:55.307
-1
13153
question
ios swift uiscrollview
viewのマスクについて

[code]

    func scrollInit(){
        /* (省略:画像を要素として追加する動作) */
    
        let maskImg : UIImage = UIImage(named: "redmask.png")!
        let mask : CALayer = CALayer()
        // mask.contents = maskImg
        mask.contents = maskImg.CGImage
        mask.frame = CGRectMake(0, 0, 80, 196)
        self.layer.mask = mask
    }
    
[/code]

おそらく、上のプログラムコードの中の、`CGImage`が抜けていたのが、うまくいかない原因だろうと考えられます。  
（「`scrollInit()`というメソッドはどう使ってるの？」という疑問は、ここでは不問としておきます。）

* * *

_質問文の更新に対しての追加です。_

そもそもマスク画像（redmask2.png）は、アルファチャンネルを持っているんだろうかという疑問をもちました。  
アルファチャンネルのあるPNGファイルのサンプルを載せておきます。  
[![画像の説明をここに入力](https://i.stack.imgur.com/weGms.png)](https://i.stack.imgur.com/weGms.png)  
この画像を、Mac標準の「プレビュー」で開くと、

[![画像の説明をここに入力](https://i.stack.imgur.com/3DCSS.png)](https://i.stack.imgur.com/3DCSS.png)  
このように、背景がグレーの格子縞になります。


CC BY-SA 3.0
2015-11-18T10:56:55.507
18996
2015-11-18T13:04:55.567
2015-11-18T13:04:55.567
7362
7362
18990
answer