IOS 10 Beta 7およびXcode 8 betaでアプリをテストしたところ、すべて正常に機能しました。しかし、ほんの数分前、私は現在利用可能なGM両方のリリースをインストールし、奇妙な問題に直面しました。
私はアプリでカスタムテーブルビューセルを使用しています。カスタムセルでは、cornerRadius
とclipsToBounds
を使用して丸みのあるビューを作成しています。
- (void)awakeFromNib {
[super awakeFromNib];
self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
self.tag2label.clipsToBounds=YES;
}
これは以前は問題ありませんでしたが、新しいGMでは、角が丸くなったビューがすべて解放されます。これはUIView
、UILabels
、UIButtons
。
これを以下で解決しました。
これが新しい要件かどうかはわかりませんが、[self layoutIfNeeded];
cornerRadius
を行う前。したがって、新しいカスタムawakeFromNib
は次のようになります。
- (void)awakeFromNib {
[super awakeFromNib];
[self layoutIfNeeded];
self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
self.tag2label.clipsToBounds=YES;
}
これで、すべて正常に表示されます。
CornerRadius = height/2で非表示のビューを修正するには、カテゴリUIView + LayoutFixを作成します
ファイルUIView + LayoutFix.mにコードを追加します。
- (void)awakeFromNib {
[super awakeFromNib];
[self layoutIfNeeded];
}
yourProject.PCHファイルにカテゴリを追加します。
ビューで[super awakeFromNib]を使用した場合にのみ機能します。
MyView.m
- (void)awakeFromNib {
[super awakeFromNib];
...
}
cornerRadius
自体は正常に機能しますが、フレームのサイズが誤って報告されます。 layoutIfNeeded
が問題を修正する理由です。
デバッグビュー階層でもビューを表示できますが、アプリでは表示できません。
影響を受けるマスク/クリップビューでlayoutIfNeeded
を呼び出す必要があります。
(たとえば、UIImageView
があり、そのレイヤーでmasksToBounds
を実行し、アプリなどでビューを表示できない場合)
次のようにビューのサブクラスを作成できます。
@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
alwaysは適切に丸みを帯びています。
私はこのアプローチを使用し、Xcode8およびiOS10へのアップグレードに問題はありませんでした。