0

グラデーションを適用したい場所に( ) があるUITableViewCellがあります。このセルには AutoLayout があるため、フレームが変更されたときにグラデーション フレームを更新したいと考えています。UIViewgradientViewgradientView

次のことを試しましたが、どれも機能しませんでした。

-(void)layoutSubviews{
    [super layoutSubviews];
     self.gradient.frame = self.gradientView.bounds;
}

-(void)updateConstraints{
    [super updateConstraints];
    self.gradient.frame = self.gradientView.bounds;
}

-(void)updateConstraintsIfNeeded{
    [super updateConstraintsIfNeeded];
    self.gradient.frame = self.gradientView.bounds;
}

また、セル内でこれを使用することはできません:

- (void)viewDidLayoutSubviews{}
4

2 に答える 2

2

個人的には、レイヤーフレームの変更には常にKVOを使用しています。セルのサブビューが読み込まれた後にこの行を挿入します ( -(void)awakeFromNibIB/ストーリーボードを使用している場合)。この行は、セルの存続期間中に一度だけ呼び出されることが重要です!

[self.gradientView.layer addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:nil];

次に、このメソッドを実装します。

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if(object==self.gradientView.layer && self.gradient.superlayer!=nil){
        CGRect newFrame = [change[NSKeyValueChangeNewKey] CGRectValue];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.gradient.frame = newFrame;
        });
    }
}

フレームの更新をdispatch_asyncブロックに入れました。これがないとレイヤーが更新されなかったからです。

また、オブザーバーを削除することを忘れないでください。解放中:

-(void)dealloc{
    [self.gradientView.layer removeObserver:self forKeyPath:@"bounds"];
}
于 2014-12-03T14:35:03.887 に答える