2017-04-20 12 views
1

私はカスタムを作成しており、描画インジケーターを持つことになりますので、当然Drawメソッドのオーバーライドを行いました。しかし、オーバーライドを適用した後に、Drawメソッドが呼び出されても、プログレスバーを増減するために使用されたSetProgressメソッドが更新されなくなったことに気付きました。描画メソッドのオーバーライド後にUIProgressViewが更新されない

カスタムクラス:によって呼び出さ

public class ModifiedProgressBar : UIProgressView 
{ 
    public ModifiedProgressBar(IntPtr handle) : base(handle) 
    { 
    } 

    public override void Draw(CGRect rect) 
    { 
     base.Draw(rect); 
    } 
} 

private void UpdateDisplay(float step) 
{ 
    this.modifiedProgressBar.SetProgress(step); 
} 

UpdateDisplayは、その後、インクリメント/デクリメントボタンによって呼び出されます。このコードは、オーバーレイを配置しないで、UIProgressViewクラスとModifiedProgressBarクラスに対して完全に正常に動作します。 Progressプロパティも新しい設定値で更新され、ビューは更新されません。私はSetNeedsDisplayを呼び出すことを試みましたが、これは更新するビューを強制しませんでした。ここでカバーの下で何が起きているのですか?これが適切に描けるようにする方法はありますか?前もって感謝します!

答えて

1

実際に描画ルーチンを提供し、ベースを呼び出さずに、もちろんProgressプロパティに基づいて図面を変更する必要があります。黄色の長方形のような単純な

何か:

enter image description here

public override void Draw(CGRect rect) 
{ 
    var color = UIColor.FromRGBA(1.0f, 1.0f, 0.0f, 1.000f); 
    var rectanglePath = UIBezierPath.FromRect(new CGRect(rect.X, rect.Y, rect.Width * Progress, rect.Height)); 
    color.SetFill(); 
    rectanglePath.Fill(); 
} 

または赤の先のとがっのthingie™:あなたの助けを

enter image description here

public override void Draw(CGRect frame) 
{ 
    var context = UIGraphics.GetCurrentContext(); 
    var color2 = UIColor.FromRGBA(0.199f, 0.018f, 0.018f, 1.000f); 
    var shadow = new NSShadow(); 
    shadow.ShadowColor = UIColor.Black; 
    shadow.ShadowOffset = new CGSize(3.1f, 3.1f); 
    shadow.ShadowBlurRadius = 5.0f; 
    UIBezierPath bezierPath = new UIBezierPath(); 
    bezierPath.MoveTo(new CGPoint(frame.GetMinX() + 0.00935f * frame.Width * Progress, frame.GetMinY() + 0.01351f * frame.Height)); 
    bezierPath.AddLineTo(new CGPoint(frame.GetMinX() + 0.99537f * frame.Width * Progress, frame.GetMinY() + 0.50000f * frame.Height)); 
    bezierPath.AddLineTo(new CGPoint(frame.GetMinX() + 0.99537f * frame.Width * Progress, frame.GetMinY() + 0.50000f * frame.Height)); 
    bezierPath.AddLineTo(new CGPoint(frame.GetMinX() + 0.00935f * frame.Width * Progress, frame.GetMinY() + 0.98570f * frame.Height)); 
    bezierPath.AddLineTo(new CGPoint(frame.GetMinX() + 0.00935f * frame.Width * Progress, frame.GetMinY() + 0.01351f * frame.Height)); 
    bezierPath.ClosePath(); 
    bezierPath.LineCapStyle = CGLineCap.Square; 
    bezierPath.LineJoinStyle = CGLineJoin.Bevel; 
    context.SaveState(); 
    context.SetShadow(shadow.ShadowOffset, shadow.ShadowBlurRadius, shadow.ShadowColor.CGColor); 
    UIColor.Red.SetFill(); 
    bezierPath.Fill(); 
    context.RestoreState(); 
    color2.SetStroke(); 
    bezierPath.LineWidth = 1.0f; 
    bezierPath.Stroke(); 
} 
+0

おかげで、それは次のようになりますこれは私の問題に取り組む最善の方法ではありませんでした。私は標準の 'UIProgressView'の機能を失いたくないので、代わりに' UIView'から継承した独自のカスタムクラスを書いて、アプリケーションの現在の 'UIProgressView'の上に描画しました。あなたの詳細な答えは、drawメソッドがオーバーライドされたときに何が起こっているのかを理解する助けになりました。 – PantAaroN

関連する問題