web-dev-qa-db-ja.com

iOS 10 GM with xcode 8 GMは、roundedCornersおよびclipsToBoundsによりビューが消えます

IOS 10 Beta 7およびXcode 8 betaでアプリをテストしたところ、すべて正常に機能しました。しかし、ほんの数分前、私は現在利用可能なGM両方のリリースをインストールし、奇妙な問題に直面しました。

私はアプリでカスタムテーブルビューセルを使用しています。カスタムセルでは、cornerRadiusclipsToBoundsを使用して丸みのあるビューを作成しています。

- (void)awakeFromNib {
    [super awakeFromNib];
    self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
    self.tag2label.clipsToBounds=YES;
}

これは以前は問題ありませんでしたが、新しいGMでは、角が丸くなったビューがすべて解放されます。これはUIViewUILabelsUIButtons

これを以下で解決しました。

38
Pranoy C

これが新しい要件かどうかはわかりませんが、[self layoutIfNeeded];cornerRadiusを行う前。したがって、新しいカスタムawakeFromNibは次のようになります。

- (void)awakeFromNib {
    [super awakeFromNib];
    [self layoutIfNeeded];
    self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
    self.tag2label.clipsToBounds=YES;
}

これで、すべて正常に表示されます。

75
Pranoy C

CornerRadius = height/2で非表示のビューを修正するには、カテゴリUIView + LayoutFixを作成します

ファイルUIView + LayoutFix.mにコードを追加します。

- (void)awakeFromNib {
    [super awakeFromNib];
    [self layoutIfNeeded];
}

yourProject.PCHファイルにカテゴリを追加します。

ビューで[super awakeFromNib]を使用した場合にのみ機能します。

MyView.m

- (void)awakeFromNib {
    [super awakeFromNib];
    ...
}
2
ealee

cornerRadius自体は正常に機能しますが、フレームのサイズが誤って報告されます。 layoutIfNeededが問題を修正する理由です。

1
olx

TVOS 10への移行で同じ問題に直面しました。自動レイアウト制約を削除し、ストーリーボードの新しいAutoresizing設定を使用して解決しました。

Autoresizing settings panel

私の観察では、iOS 10/TVOS 10はawakeFromNibを呼び出す前に自動レイアウトベースのビューをレイアウトせず、同じメソッドを呼び出す前に自動サイズ変更マスクを使用してビューをレイアウトしています。

1
Apurva

デバッグビュー階層でもビューを表示できますが、アプリでは表示できません。

影響を受けるマスク/クリップビューでlayoutIfNeededを呼び出す必要があります。

(たとえば、UIImageViewがあり、そのレイヤーでmasksToBoundsを実行し、アプリなどでビューを表示できない場合)

0
Jakub Truhlář

次のようにビューのサブクラスを作成できます。

@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へのアップグレードに問題はありませんでした。

0