我的问题是我无法始终如一地将我的CALayer作为中心。
我有一个相关的SO问题here。这个问题的答案是前进的进展,并将我带到了现在的问题。注意在我的相关问题的答案中,@ WarrenBurton似乎只测试肖像模式。
我认为这个问题,实际上是在UIImageView上计算/定位子层死点可能与为UIImageView选择的图像的实际大小有关,但我可能错了。
以下是纵向模式旋转的print()
输出:
willTransitionToTraitCollection()!
blurFilerMask != nil
resetMaskOverlay()!
(160.0, 128.0)
328.0
200.0
BlurFilterMask -> drawInContext()!
但CALayer以景观模式为中心:
以下是横向模式轮换的print()
输出:
willTransitionToTraitCollection()!
blurFilerMask != nil
resetMaskOverlay()!
(284.0, 108.0)
568.0
200.0
BlurFilterMask -> drawInContext()!
我的UIImage尺寸检查器截图,约束可能是最重要的部分:
我的UIImage模式为Scale To Fill
以下是我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在Portrait模式下正确居中但不是Landscape模式,与我之前的截图演示完全相反:
使用UIImageView“填充”超视图约束的纵向模式:
使用UIImageView“填充”超视图约束的横向模式:
答案 0 :(得分:2)
您的代码问题是设置BlurFilterMask的中心。中心应该是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()
}