gpt4 book ai didi

ios - Consistenlty 居中 CALayer 子层在 UIImageView

转载 作者:可可西里 更新时间:2023-11-01 01:37:12 34 4
gpt4 key购买 nike

  • Xcode 7.2
  • swift 2

我的问题是我无法始终居中我的 CALayer。

我有一个相关的 SO 问题 here .这个问题的答案是前进的进步,让我想到了我现在遇到的问题。请注意,在我的相关问题的回答中,@WarrenBurton 似乎只测试纵向模式。

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

enter image description here

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

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

但 CALayer 在 Landscape 模式下居中:

enter image description here

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

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

我的 UIImage Size Inspector 截图,约束可能是最重要的考虑部分:

enter image description here

我的 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 在纵向模式下正确居中,但不是横向模式,这与我之前的屏幕截图演示完全相反:

UIImageView 约束: enter image description here

带有 UIImageView“填充” super View 约束的纵向模式:

enter image description here

带有 UIImageView“填充” super View 约束的横向模式:

enter image description here

最佳答案

您的代码的问题在于设置 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()

}

关于ios - Consistenlty 居中 CALayer 子层在 UIImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677678/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com