Ios 在UIImageView上以CALayer子层为中心的一致性 Xcode 7.2 斯威夫特2

Ios 在UIImageView上以CALayer子层为中心的一致性 Xcode 7.2 斯威夫特2,ios,xcode,swift,Ios,Xcode,Swift,我的问题是,我不能始终集中我的CALayer 我有一个相关的问题。这个问题的答案是向前的进展,这让我想到了我现在面临的问题。请注意,在回答我的相关问题时,@WarrenBurton似乎只测试肖像模式 我认为这个问题,实际上是计算/定位UIImageView上的子层死点,可能与为UIImageView选择的图像的实际大小有关,但我可能错了 这是我的print()纵向模式旋转输出: willTransitionToTraitCollection()! blurFilerMask != nil re

我的问题是,我不能始终集中我的CALayer

我有一个相关的问题。这个问题的答案是向前的进展,这让我想到了我现在面临的问题。请注意,在回答我的相关问题时,@WarrenBurton似乎只测试肖像模式

我认为这个问题,实际上是计算/定位UIImageView上的子层死点,可能与为UIImageView选择的图像的实际大小有关,但我可能错了

这是我的
print()
纵向模式旋转输出:

willTransitionToTraitCollection()!
blurFilerMask != nil
resetMaskOverlay()!
(160.0, 128.0)
328.0
200.0
BlurFilterMask -> drawInContext()!
willTransitionToTraitCollection()!
blurFilerMask != nil
resetMaskOverlay()!
(284.0, 108.0)
568.0
200.0
BlurFilterMask -> drawInContext()!
但CALayer以横向模式为中心:

这是我的
print()
横向模式旋转输出:

willTransitionToTraitCollection()!
blurFilerMask != nil
resetMaskOverlay()!
(160.0, 128.0)
328.0
200.0
BlurFilterMask -> drawInContext()!
willTransitionToTraitCollection()!
blurFilerMask != nil
resetMaskOverlay()!
(284.0, 108.0)
568.0
200.0
BlurFilterMask -> drawInContext()!

我的UIIMAGE大小检查器截屏,约束可能要考虑的最重要的部分:

我的UIImage模式是“按比例填充”

以下是my
TestViewController
中的所有代码:

import UIKit

class TestViewController: UIViewController {

    @IBOutlet weak var heroImageView: UIImageView!
      var blurFilterMask:BlurFilterMask! = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func viewDidLayoutSubviews() {
        super.viewWillLayoutSubviews()
        resetMaskOverlay()
    }


    override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator)
        print("willTransitionToTraitCollection()!")

        if blurFilterMask != nil {
            print("blurFilerMask != nil")
            blurFilterMask.removeFromSuperlayer()
            blurFilterMask = nil
        }

    }

    func resetMaskOverlay(){
        print("resetMaskOverlay()!")

        print(heroImageView.center)
        print(CGRectGetWidth(heroImageView.bounds))
        print(CGRectGetHeight(heroImageView.bounds))

        if blurFilterMask == nil {
            blurFilterMask = BlurFilterMask()
        }

        blurFilterMask.diameter = 80
        blurFilterMask.frame = heroImageView.bounds
        blurFilterMask.origin = heroImageView.center
        blurFilterMask.shouldRasterize = true
        heroImageView.layer.addSublayer(blurFilterMask)
        blurFilterMask.setNeedsDisplay()

    }

}
这是我的CALayer,我称之为BlurFilterMask:

import UIKit

class BlurFilterMask : CALayer {

    private let GRADIENT_WIDTH : CGFloat = 50.0

    var origin : CGPoint = CGPointZero {
        didSet {
            //setNeedsDisplay()
        }
    }
    var diameter : CGFloat = 50.0 {
        didSet {
            //setNeedsDisplay()
        }
    }

    override init() {
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func drawInContext(ctx: CGContext) {
        print("BlurFilterMask -> drawInContext()!")
        CGContextSaveGState(ctx)

        let clearRegionRadius : CGFloat  = self.diameter * 0.5
        let blurRegionRadius : CGFloat  = clearRegionRadius + GRADIENT_WIDTH

        let baseColorSpace = CGColorSpaceCreateDeviceRGB();
        let colours : [CGFloat] = [0.0, 0.0, 0.0, 0.0,     // Clear region
            0.0, 0.0, 0.0, 0.6] // blur region color
        let colourLocations : [CGFloat] = [0.0, 0.0]
        let gradient = CGGradientCreateWithColorComponents (baseColorSpace, colours, colourLocations, 2)


        CGContextDrawRadialGradient(ctx, gradient, self.origin, clearRegionRadius, self.origin, blurRegionRadius, .DrawsAfterEndLocation);


    }

}
现在进一步测试这个问题,我可以演示与我的第一个屏幕截图完全相反的场景(第一个场景是:纵向模式未居中,横向模式正确居中)

在下一个例子中。我已更改UIImageView约束,以便填充UIImageView填充SuperView,您可以在下面看到我的CALayer在纵向模式下正确居中,而不是横向模式,这与我之前的屏幕截图演示完全相反:

UIImageView约束:

具有UIImageView“填充”superview约束的纵向模式:

具有UIImageView“填充”superview约束的横向模式:


代码的问题是设置BlurFilterMask的中心。中心应该是过滤器的中心吗?使用此更新的“resetMaskOverlay”功能

    func resetMaskOverlay(){
    print("resetMaskOverlay()!")

    print(heroImageView.center)
    print(CGRectGetWidth(heroImageView.bounds))
    print(CGRectGetHeight(heroImageView.bounds))

    if blurFilterMask == nil {
        blurFilterMask = BlurFilterMask()
    }

    blurFilterMask.diameter = 80
    blurFilterMask.frame = heroImageView.bounds
    blurFilterMask.origin = CGPointMake(CGRectGetMidX(heroImageView.bounds), CGRectGetMidY(heroImageView.bounds))
    blurFilterMask.shouldRasterize = true
    heroImageView.layer.addSublayer(blurFilterMask)
    blurFilterMask.setNeedsDisplay()

}

看看这个答案,我今晚回家后会试试的