clipsToBounds заставляет UIImage не отображаться в iOS10 & XCode 8
я переключил свой проект на новые бета-версии iOS 10 и XCode 8. Во всех трех областях моего приложения, где я использую:
imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true
связанные изображения не отображаются вообще. Я попытался очистить проект, а также папку сборки, перезапустить устройство, попробовать различные симуляторы, повторно добавить imageView, программно установив связанный UIImage
вместо выбора одного из активов.
удаление clipsToBounds
строка показывает прямоугольное изображение независимо от того,masksToBounds
is true
или false
. Как я могу сделать круговое изображение в XCode8 / iOS10 ?
Edit: проект Swift 2.x и еще не обновлен до синтаксиса Swift 3.0.
10 ответов
у меня была такая же проблема и вызов layoutIfNeeded
перед всем закругленным углом / clipsToBounds
материал исправил проблему. iOS 10 GM с xcode 8 GM заставляет представления исчезать из-за roundedCorners & clipsToBounds
эта проблема также случилось со мной.
я переместил этот код imageView.layer.cornerRadius = imageView.frame.size.width/2
с - (void)awakeFromNib
to - (void)drawRect:(CGRect)rect
и эта проблема ушла.
мой imageView имеет размер autolayout. Я думаю, что высота и ширина не определяются при пробуждении от пера на iOS 10.
Это звучит так, как будто это может быть связано с новой ошибкой, так как iOS 10 и Xcode 8, где представления инициализируются размером 1000x1000, и при попытке установить радиус угла в половину вашего кадра, он устанавливает его в 500 вместо этого. Это описано далее в этом вопросе здесь:поскольку Xcode 8 и iOS10, представления не имеют правильного размера в viewDidLayoutSubviews. Моя причина думать, что это исправление проблемы 1000x1000, чтобы вызвать подвиды макета, прежде чем делать что-либо, что требует размеров для что-то, что было построено на interface builder.
у меня была та же проблема. Не отображается на телефоне, но идеально подходит для раскадровки и отладчика пользовательского интерфейса. Он также работал, когда я ставил проект "открывается с Xcode 7" вместо 8, но не был удовлетворительным решением. Поэтому я копнул и выяснил проблему. Проблема заключалась в том, что класс выглядел так:
@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
}
}
}
обратите внимание, что ни один из выше работал для меня, и я имею в виду :
- вызов
layoutIfNeeded
наlayoutSubviews()
- вызов
layoutIfNeeded
наawakeFromNib
моей кнопки (или моей ячейки, содержащей кнопку) - вызов
layoutIfNeeded
наlayoutSubview
камеры - вызов
contentView.layoutIfNeeded()
наawakeFromNib
камеры - вызов
view.layoutIfNeeded()
на мой взгляд контроллер
у меня был 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()
это может быть проблема макет. Настройка clipToBounds
в false будет показывать изображение, даже если его размер равен нулю. Можете ли вы распечатать frame
картинки?
если вы выберите cornerRadius
и clipToBounds
свойства viewDidLoad
, попробуйте сделать это в viewDidLayoutSubviews()
.
вы также можете попробовать позвонить self.view.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.
Я решил проблемы, используя layoutIfNeeded для ячейки my tableview, показывающей изображение профиля пользователя. Я хочу, чтобы изображение было круглым углом
код выглядит следующим образом: - (void)awakeFromNib { [super awakeFromNib]; [self layoutIfNeeded];
[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;}
вы должны вызвать layoutSubviews () в главном представлении перед вызовом imageView.рамка.размер.ширина
[self.view layoutSubviews];
imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true