clipsToBounds 导致 UIImage 不显示在 iOS10 & XCode 8
clipsToBounds causes UIImage to not display in iOS10 & XCode 8
我将我的项目切换到 iOS 10 和 XCode 8 的新测试版。在我使用的应用程序的所有三个区域中:
imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true
关联的图像根本没有显示。我尝试清理项目和构建文件夹,重新启动设备,尝试各种模拟器,重新添加 imageView,以编程方式设置关联的 UIImage
而不是从资产中选择一个。
无论masksToBounds
是true
还是false
,删除clipsToBounds
行都会显示矩形图像。如何在 XCode8 / iOS10 中制作圆形图像?
编辑:该项目是 Swift 2.x,尚未更新到 Swift 3.0 语法。
这可能是布局问题。将 clipToBounds
设置为 false 将显示图像,即使其大小为零。你能打印你的图像 frame
吗?
如果您在 viewDidLoad
中设置 cornerRadius
和 clipToBounds
属性,请尝试在 viewDidLayoutSubviews()
中设置。
您也可以尝试致电 self.view.layoutIfNeeded()
。
调用前应在主视图上调用 layoutSubviews() imageView.frame.size.width
[self.view layoutSubviews];
imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true
这个问题也发生在我身上
我将这些代码 imageView.layer.cornerRadius = imageView.frame.size.width/2
从 - (void)awakeFromNib
移到了 - (void)drawRect:(CGRect)rect
,这个问题就消失了。
我的 imageView 由自动布局调整大小。我认为在 iOS 10.
上从笔尖唤醒时高度和宽度没有确定
我遇到了同样的问题,在所有圆角/clipsToBounds
之前调用 layoutIfNeeded
解决了这个问题。
使用 obj-c,将语法从 viewDidLoad
移动到 viewDidLayoutSubviews
对我有用。
我刚刚实现了这样的圆角
@implementation RoundImageView
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
self.layer.masksToBounds = YES;
self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2;
[self addObserver:self
forKeyPath:@"bounds"
options:NSKeyValueObservingOptionNew
context:(__bridge void * _Nullable)(self)];
}
return self;
}
-(void)dealloc
{
[self removeObserver:self
forKeyPath:@"bounds"
context:(__bridge void * _Nullable)(self)];
}
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context
{
if(context == (__bridge void * _Nullable)(self) && object == self && [keyPath isEqualToString:@"bounds"])
{
self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2;
}
}
@end
所以我总是有适当的圆角。
我没有升级到 iOS10 和 XCode8
的问题
我认为问题的发生是因为我们按照@Pranoy C 的说法设置了圆角和裁剪子视图。
我通过对显示用户个人资料图片的 tableview 单元格使用 layoutIfNeeded 解决了这些问题。我想确保图片是圆角的
代码如下:
- (void)awakeFromNib {
[超级 awakeFromNib];
[自行布局IfNeeded];
[self.inputIndicator_imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
self.profile_pic_edit_imageView.layer.cornerRadius = self.profile_pic_edit_imageView.frame.size.width/2;
self.profile_pic_edit_imageView.layer.borderWidth = 1.0;
self.profile_pic_edit_imageView.layer.borderColor = GRAY_COLOR_SUPER_LIGHT.CGColor;
self.profile_pic_edit_imageView.clipsToBounds = YES;}
我遇到了同样的问题。未在 phone 上显示,但在 Storyboard 和 UI 调试器上完美显示。当我将项目 "Opens with Xcode 7" 而不是 8 时,它也能正常工作,但不是一个令人满意的解决方案。所以我挖掘并发现了问题所在。问题是 class 看起来像这样:
@IBDesignable public class MyButton: UIButton {
@IBInspectable var styleName: String = "" {
didSet {
switch styleName {
case "RoundedLight":
tintColor = UIColor.lightPinkColor()
layer.borderColor = UIColor.whiteColor().CGColor
layer.borderWidth = 1
layer.masksToBounds = true
default:
break
}
}
}
override public func layoutSubviews() {
super.layoutSubviews()
switch styleName {
case "RoundedLight":
layer.cornerRadius = frame.height / 2
default:
break
}
}
}
我把它改成了这个,现在可以用了:
@IBDesignable public class MyButton: UIButton {
@IBInspectable var styleName: String = "" {
didSet {
layoutIfNeeded()
}
}
override public func layoutSubviews() {
super.layoutSubviews()
switch styleName {
case "RoundedLight":
tintColor = UIColor.lightPinkColor()
layer.borderColor = UIColor.whiteColor().CGColor
layer.borderWidth = 1
layer.cornerRadius = frame.height / 2
layer.masksToBounds = true
default:
break
}
}
}
请注意,上面的 none 对我有用,我的意思是:
- 在
layoutSubviews()
中调用 layoutIfNeeded
- 在我的按钮(或包含该按钮的单元格)的
awakeFromNib
中调用 layoutIfNeeded
- 在我的手机
layoutSubview
中调用 layoutIfNeeded
- 在我的手机
awakeFromNib
中呼叫 contentView.layoutIfNeeded()
- 在我的视图控制器中调用
view.layoutIfNeeded()
这听起来可能是由于 iOS 10 和 Xcode 8 以来的一个新错误,其中视图以 1000x1000 大小初始化,并且在尝试将角半径设置为框架的一半时,它而是将其设置为 500。这在此处的问题中有进一步记录:。我认为这是对 1000x1000 问题的修复,它可以在执行任何需要在界面构建器上构建的内容的大小之前调用布局子视图。
我的 ImageView 是完全圆形的。下面是代码:
//MARK:- Misc functions
func setProfileImage() {
imgProfile.layer.masksToBounds = false
imgProfile.layer.cornerRadius = imgProfile.frame.size.height/2
imgProfile.clipsToBounds = true
imgProfile.contentMode = UIViewContentMode.ScaleToFill
}
这在 iOS 9 中工作正常。但是,in iOS 10 Xcode 8 the ImageView disappears.
调试后发现ClipsToBound是罪魁祸首。
所以将代码放在 viewDidLayoutSubviews()
中解决了问题。
override func viewDidLayoutSubviews() {
setProfileImage()
}
您也可以使用self.view.layoutIfNeeded()
我将我的项目切换到 iOS 10 和 XCode 8 的新测试版。在我使用的应用程序的所有三个区域中:
imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true
关联的图像根本没有显示。我尝试清理项目和构建文件夹,重新启动设备,尝试各种模拟器,重新添加 imageView,以编程方式设置关联的 UIImage
而不是从资产中选择一个。
无论masksToBounds
是true
还是false
,删除clipsToBounds
行都会显示矩形图像。如何在 XCode8 / iOS10 中制作圆形图像?
编辑:该项目是 Swift 2.x,尚未更新到 Swift 3.0 语法。
这可能是布局问题。将 clipToBounds
设置为 false 将显示图像,即使其大小为零。你能打印你的图像 frame
吗?
如果您在 viewDidLoad
中设置 cornerRadius
和 clipToBounds
属性,请尝试在 viewDidLayoutSubviews()
中设置。
您也可以尝试致电 self.view.layoutIfNeeded()
。
调用前应在主视图上调用 layoutSubviews() imageView.frame.size.width
[self.view layoutSubviews];
imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true
这个问题也发生在我身上
我将这些代码 imageView.layer.cornerRadius = imageView.frame.size.width/2
从 - (void)awakeFromNib
移到了 - (void)drawRect:(CGRect)rect
,这个问题就消失了。
我的 imageView 由自动布局调整大小。我认为在 iOS 10.
上从笔尖唤醒时高度和宽度没有确定我遇到了同样的问题,在所有圆角/clipsToBounds
之前调用 layoutIfNeeded
解决了这个问题。
使用 obj-c,将语法从 viewDidLoad
移动到 viewDidLayoutSubviews
对我有用。
我刚刚实现了这样的圆角
@implementation RoundImageView
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
self.layer.masksToBounds = YES;
self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2;
[self addObserver:self
forKeyPath:@"bounds"
options:NSKeyValueObservingOptionNew
context:(__bridge void * _Nullable)(self)];
}
return self;
}
-(void)dealloc
{
[self removeObserver:self
forKeyPath:@"bounds"
context:(__bridge void * _Nullable)(self)];
}
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context
{
if(context == (__bridge void * _Nullable)(self) && object == self && [keyPath isEqualToString:@"bounds"])
{
self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2;
}
}
@end
所以我总是有适当的圆角。 我没有升级到 iOS10 和 XCode8
的问题我认为问题的发生是因为我们按照@Pranoy C 的说法设置了圆角和裁剪子视图。
我通过对显示用户个人资料图片的 tableview 单元格使用 layoutIfNeeded 解决了这些问题。我想确保图片是圆角的
代码如下: - (void)awakeFromNib { [超级 awakeFromNib]; [自行布局IfNeeded];
[self.inputIndicator_imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
self.profile_pic_edit_imageView.layer.cornerRadius = self.profile_pic_edit_imageView.frame.size.width/2;
self.profile_pic_edit_imageView.layer.borderWidth = 1.0;
self.profile_pic_edit_imageView.layer.borderColor = GRAY_COLOR_SUPER_LIGHT.CGColor;
self.profile_pic_edit_imageView.clipsToBounds = YES;}
我遇到了同样的问题。未在 phone 上显示,但在 Storyboard 和 UI 调试器上完美显示。当我将项目 "Opens with Xcode 7" 而不是 8 时,它也能正常工作,但不是一个令人满意的解决方案。所以我挖掘并发现了问题所在。问题是 class 看起来像这样:
@IBDesignable public class MyButton: UIButton {
@IBInspectable var styleName: String = "" {
didSet {
switch styleName {
case "RoundedLight":
tintColor = UIColor.lightPinkColor()
layer.borderColor = UIColor.whiteColor().CGColor
layer.borderWidth = 1
layer.masksToBounds = true
default:
break
}
}
}
override public func layoutSubviews() {
super.layoutSubviews()
switch styleName {
case "RoundedLight":
layer.cornerRadius = frame.height / 2
default:
break
}
}
}
我把它改成了这个,现在可以用了:
@IBDesignable public class MyButton: UIButton {
@IBInspectable var styleName: String = "" {
didSet {
layoutIfNeeded()
}
}
override public func layoutSubviews() {
super.layoutSubviews()
switch styleName {
case "RoundedLight":
tintColor = UIColor.lightPinkColor()
layer.borderColor = UIColor.whiteColor().CGColor
layer.borderWidth = 1
layer.cornerRadius = frame.height / 2
layer.masksToBounds = true
default:
break
}
}
}
请注意,上面的 none 对我有用,我的意思是:
- 在
layoutSubviews()
中调用 - 在我的按钮(或包含该按钮的单元格)的
awakeFromNib
中调用layoutIfNeeded
- 在我的手机
layoutSubview
中调用layoutIfNeeded
- 在我的手机
awakeFromNib
中呼叫contentView.layoutIfNeeded()
- 在我的视图控制器中调用
view.layoutIfNeeded()
layoutIfNeeded
这听起来可能是由于 iOS 10 和 Xcode 8 以来的一个新错误,其中视图以 1000x1000 大小初始化,并且在尝试将角半径设置为框架的一半时,它而是将其设置为 500。这在此处的问题中有进一步记录:
我的 ImageView 是完全圆形的。下面是代码:
//MARK:- Misc functions
func setProfileImage() {
imgProfile.layer.masksToBounds = false
imgProfile.layer.cornerRadius = imgProfile.frame.size.height/2
imgProfile.clipsToBounds = true
imgProfile.contentMode = UIViewContentMode.ScaleToFill
}
这在 iOS 9 中工作正常。但是,in iOS 10 Xcode 8 the ImageView disappears.
调试后发现ClipsToBound是罪魁祸首。
所以将代码放在 viewDidLayoutSubviews()
中解决了问题。
override func viewDidLayoutSubviews() {
setProfileImage()
}
您也可以使用self.view.layoutIfNeeded()