UIImageView
にサブレイヤーを追加しようとしていますが、機能しません。
photo0
からphoto9
までの10個の画像のセットがあり、5秒のタイマーで表示します。shanghaiImage
は私の背景ですこのマーティの上に、透明(上)から黒(下)へのグラデーションを追加したいと思います。
助けてくれてありがとう :)
Swift 3。
この部分は問題ありません:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var shanghaiImage: UIImageView!
// beginning index
var _curentImageIndex:Int = 0
// number of images
let NUMBER_OF_IMAGES:Int = 10
// creation of the Timer
var _uiTimer:Timer?
override func viewDidLoad() {
super.viewDidLoad()
showPhoto(atIndex: _curentImageIndex)
}
// MARK TIMER ---------
func selectNewTimer(){
if let existingTimer:Timer = _uiTimer{
existingTimer.invalidate()
}
_uiTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(ViewController.showNextImage), userInfo: nil, repeats: true)
}
ここに問題があります。なぜ機能しないのかわかりません。
// MARK PHOTO ---------
func showPhoto(atIndex index:Int){
let photoName:String = "photo\(index)"
shanghaiImage.image = UIImage(named: photoName)
let gradient = CAGradientLayer()
gradient.frame = shanghaiImage.bounds
let startColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 1)
let endColor = UIColor.black
gradient.colors = [startColor, endColor]
shanghaiImage.layer.insertSublayer(gradient, at: 0)
_curentImageIndex = index
selectNewTimer()
}
func showNextImage() {
var nextPhotoIndex:Int = _curentImageIndex + 1
if nextPhotoIndex >= NUMBER_OF_IMAGES {
nextPhotoIndex = 0
}
showPhoto(atIndex: nextPhotoIndex)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
UIView
の上にグラデーション付きのUIImageView
を置くことをお勧めします:
@IBOutlet weak var shanghaiImage: UIImageView!
let view = UIView(frame: profileImageView.frame)
let gradient = CAGradientLayer()
gradient.frame = view.frame
gradient.colors = [UIColor.clear.cgColor, UIColor.black.cgColor]
gradient.locations = [0.0, 1.0]
view.layer.insertSublayer(gradient, at: 0)
shanghaiImage.addSubview(view)
shanghaiImage.bringSubview(toFront: view)
Objective-C:
UIView *view = [[UIView alloc] initWithFrame: profileImageView.frame];
CAGradientLayer *gradient = [[CAGradientLayer alloc] init];
gradient.frame = view.frame;
gradient.colors = @[ (id)[[UIColor clearColor] CGColor], (id)[[UIColor blackColor] CGColor] ];
gradient.locations = @[@0.0, @1.0];
[view.layer insertSublayer: gradient atIndex: 0];
[shanghaiImage addSubview: view];
[shanghaiImage bringSubviewToFront: view];
エクステンションSwift 3、Swift 4 and Swift 5
UIImageView_extension.SwiftのようなUIImageViewの拡張用の新しいファイルを作成し、次のコードに設定します。
UIImageViewはUIViewを拡張したものであるため、UIImageViewをUIViewに変更すると、動的になります。したがって、UIImageViewではなくUIViewを使用しました。
import UIKit
extension UIView{
// For insert layer in Foreground
func addBlackGradientLayerInForeground(frame: CGRect, colors:[UIColor]){
let gradient = CAGradientLayer()
gradient.frame = frame
gradient.colors = colors.map{$0.cgColor}
self.layer.addSublayer(gradient)
}
// For insert layer in background
func addBlackGradientLayerInBackground(frame: CGRect, colors:[UIColor]){
let gradient = CAGradientLayer()
gradient.frame = frame
gradient.colors = colors.map{$0.cgColor}
self.layer.insertSublayer(gradient, at: 0)
}
}
そして、あなたのViewController.Swiftでそれを使うことができます:
class myViewController: UIViewController{
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.addBlackGradientLayerInBackground(frame: view.bounds, colors:[.clear, .black])
//Alternative
//imageView.addBlackGradientLayerInBackground(frame: imageView.frame, colors: [.clear, .black])
}
}
この関数はフレームを必要とするので、ビューまたは自分自身のimageViewからのフレームのみが必要です。常に一般的な関数のように考えれば、他のビューで将来的に問題なくグラデーションの色を変更できます。