كيف يمكنني قوة إعادة رسم (drawRect) من SubView عندما يغير الأبعاد؟
-
10-07-2019 - |
سؤال
ولدي UIView يحتوي على صف من الفئات الفرعية من UIView
. فئة فرعية قد تجاوز drawRect
: وضعت contentMode = UIViewContentModeRedraw
وبما أن يسحق المستخدم وتمتد الحاوية الأصل الاسكواش child views
وتمتد. كما يحدث تغيير شكل وأود أن يكون drawRect
دعا مرارا إلى تغيير محتويات child views
. حتى الآن لقد كنت ناجحة. ما هي الطريقة الصحيحة للقيام بذلك؟
وابتهاج،
ودوغ
المحلول
في الكاكاو، نادرا ما (إذا كان أي وقت مضى) دعوة drawRect - كنت مجرد احتفال المنطقة أو العرض كما تحتاج إلى التحديث، وسيتم تحديد موعد لأنها إعادة رسم. وهذا يسمح يعيد رسم لإبطال متعددة ليتم انهار معا.
لالكاكاو التي تعمل باللمس، وتريد إما [عرض setNeedsDisplay] أو setNeedsDisplayinRect: (CGRect) أ >
نصائح أخرى
وتحتاج إلى استدعاء [عرض setNeedsLayout]، وهذا يجب أن يسبب subviews للحصول على drawRect: دعوة إذا كانت التغييرات التخطيط. أنا لم تختبر هذا، ولكن.
وهذا الحل هو مجنون قليلا، ولكن من المنطقي منطقي، ويحتوي على النتيجة البصرية كبيرة. أنا أعمل مع NSLayoutManager
وNSTextContainer
s الزوجين، ووضع خارج النص في عمودين. لأنني باستخدام أواني نصية متعددة (وأنا لست متأكدا من أنني أريد UITextView
متعددة)، أنا تجاوز الأسلوب draw(rect: CGRect)
من MyDrawingView: UIView
.
والمشكلة هي أن استخدام self.contentMode = .redraw
لا يزال ينتج في بعض قاصر تمتد على دوران - كبير بما يكفي لتكون صفقة ثقيل
ولقد لاحظت أن وضع contentMode = .left
، أو حتى contentMode = .scaleAspectFit
كان قريبا إلى ما أردت، من حيث تناوب بكسل الكمال. ولكن من الواضح، وكنت لا تحصل على دعوة التعادل احتاجه.
وهكذا - أنا تجاهلت layoutSubviews()
، تبديل contentMode
إلى .scaleAspectFit
، ودعا super.layoutSubviews()
، ثم تحولت مرة أخرى. : P
override func layoutSubviews() {
self.contentMode = .scaleAspectFit
super.layoutSubviews()
self.contentMode = .redraw
}
ومن ... الكمال.