3

UIView のカスタム ボーダーを描画する必要があります。

私はすでにそれを行うコードを持っていますが、autolayout を使い始める前に書かれたものです。

コードは基本的に、幅/高さ = 1.0f のサブレイヤーを追加します

-(void)BordeIzquierdo:(UIColor *)pcColor cfloatTamanio:(CGFloat )pcfloatTamanio
{
    CALayer* clElemento = [self layer];
    CALayer *clDerecho = [CALayer layer];
    clDerecho.borderColor = [UIColor darkGrayColor].CGColor;
    clDerecho.borderWidth = pcfloatTamanio;
    clDerecho.frame = CGRectMake(0, 1, pcfloatTamanio, self.frame.size.height);
    [clDerecho setBorderColor:pcColor.CGColor];
    [clElemento addSublayer:clDerecho];
}

問題は、autolayout では、これが layoutSubViews の前に発生することです。(0,0;0,0) も同様で、追加されたサブレイヤーは表示されません。これUIView.layer.frameは、幅/高さ = 0.0f であるためです。

このカスタム描画をviewDidLoadなどの後に実行される別のメソッドに転送せずに、このコードを作成するにはどうすればよいですかdidLayoutSubviews

viewDidLoadが呼び出される前に、このスタイリングを正しく適用したいと思います。

  • で使用できる自動レイアウト制約のようなものはありCALayersますか?
  • 他のアイデアはありますか?
4

1 に答える 1

5

iOS には CALayer の自動サイズ変更や制約はありません。(Mac OS X にはありますが、iOS にはありません。)

ここでのあなたの要件は不合理です。への通話の転送を拒否するとあなたは言いますBordeIzquierdo:。しかし、 (したがって)のサイズを知るまでは、正しいサイズを与えることはできません。Cocoa タッチ プログラミングの技術の半分は、コードを適切な場所に配置することです。必要な値が呼び出された時点で意味を持つように、呼び出しを配置する適切な場所を見つける必要があります。clDerechoselfself.layerBordeIzquierdo:

私がすることはlayoutSubviews、BOOL フラグと一緒に入れて、一度だけ実行できるようにすることです。

于 2013-04-24T22:04:07.003 に答える