10

Autolayout を使用して iOS 6 アプリケーションで作成された UIView にシャドウを追加する際に問題が発生しました。

UIView の下部に影を追加するメソッドがあるとします (これは実際には UIView のカテゴリであるため、再利用可能です)。

- (void) addShadowOnBottom {
    self.layer.shadowOffset = CGSizeMake(0, 2);
    self.layer.shadowOpacity = 0.7;
    self.layer.shadowColor = [[UIColor blackColor] CGColor];
    self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
}

いくつかの UIViewController でこのメソッドを呼び出すとviewDidLoad、おそらく計算する必要があるすべての制約が原因で、シャドウが追加されません。

viewWillAppear同じ状況でこのメソッドを呼び出すと。

このメソッドを呼び出すviewDidAppearと機能しますが、新しいビューが表示されると、影がなく、しばらくすると表示される短い瞬間があります。

shadowPath の設定をやめて行を削除すると、self.layer.shadowPathすべてが機能しますが、ビューの遷移はスムーズではありません。

だから私の質問は、Autolayout がオンになっている iOS 6 でビューに影を追加する正しい方法は何ですか?

4

3 に答える 3

2

self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath; はあなたのコードから削除し、それは私のために働いています,viewDidLoad確認してください.

大きくshdowOffsetすると、影がよりはっきりと見えます。

于 2013-03-20T09:48:58.130 に答える
1

まったく同じ問題があります...

ビューの CALayer シャドウを適切にアニメーション化することはできませんが、少なくともアニメーション後にシャドウが適切に再調整されます。

私の解決策 (私のアプリケーションでは問題なく動作します) は、shadowOpacity を 0 に設定し、アニメーションが完了した後に目的の値にリセットすることです。通常、アニメーションは速すぎて違いを認識できないため、ユーザーの観点からは、影がなくなったことさえわかりません。

これは、私のアプリケーションのコードの例です。ここでは、制約の定数値を変更しています。これは、「トレール エッジからスーパービュー」NSLayoutContraint です。

- (void) expandRightEdge
{
    [self.mainNavRightEdge setConstant:newEdgeConstant];
    [self updateCenterContainerShadow];
    [UIView animateWithDuration:ANIMATION_DURATION delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            [[NSNotificationCenter defaultCenter] postNotificationName:@"PanelLayoutChanged" object:nil];
            [self.view layoutIfNeeded];
                    } completion:^(BOOL finished) {
                    nil;
                    }];
}

- (void) updateCenterContainerShadow
{
    self.centerContainer.layer.masksToBounds = NO;
    self.centerContainer.layer.shadowOpacity = 0.8f;
    self.centerContainer.layer.shadowRadius = 5.0f;
    self.centerContainer.layer.shadowOffset = CGSizeMake(0, 0);
    self.centerContainer.layer.shadowColor = [UIColor blackColor].CGColor;
    CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:self.centerContainer.layer.bounds].CGPath;
    [self.centerContainer.layer setShadowPath:shadowPath];

    // Schedule a time to fade the shadow back in until we can figure out the CALayer + Auto-Layout issue
    [self performSelector:@selector(fadeInShadow) withObject:nil afterDelay:ANIMATION_DURATION+.05];
}

- (void) fadeInShadow
{
    [self.centerContainer.layer setShadowOpacity:0.8f];
}

2つのこと:

  • 完了ブロックに fadeInShadow を入れることもできましたが、他のコードの一部が因数分解されているため、この方がうまくいきます。
  • 「fadeInShadow」でフェードインを実行していないことに気付きましたが、アニメーションの完了後のレンダリングの速さを考えると、必要ないことがわかりました。

それが役立つことを願っています!

于 2013-02-02T03:48:14.333 に答える