كيف يمكنني قوة إعادة رسم (drawRect) من SubView عندما يغير الأبعاد؟

StackOverflow https://stackoverflow.com/questions/1441760

سؤال

ولدي UIView يحتوي على صف من الفئات الفرعية من UIView. فئة فرعية قد تجاوز drawRect: وضعت contentMode = UIViewContentModeRedraw

وبما أن يسحق المستخدم وتمتد الحاوية الأصل الاسكواش child views وتمتد. كما يحدث تغيير شكل وأود أن يكون drawRect دعا مرارا إلى تغيير محتويات child views. حتى الآن لقد كنت ناجحة. ما هي الطريقة الصحيحة للقيام بذلك؟

وابتهاج،

ودوغ

هل كانت مفيدة؟

المحلول

في الكاكاو، نادرا ما (إذا كان أي وقت مضى) دعوة drawRect - كنت مجرد احتفال المنطقة أو العرض كما تحتاج إلى التحديث، وسيتم تحديد موعد لأنها إعادة رسم. وهذا يسمح يعيد رسم لإبطال متعددة ليتم انهار معا.

لالكاكاو التي تعمل باللمس، وتريد إما [عرض setNeedsDisplay] أو setNeedsDisplayinRect: (CGRect)

نصائح أخرى

وتحتاج إلى استدعاء [عرض setNeedsLayout]، وهذا يجب أن يسبب subviews للحصول على drawRect: دعوة إذا كانت التغييرات التخطيط. أنا لم تختبر هذا، ولكن.

وهذا الحل هو مجنون قليلا، ولكن من المنطقي منطقي، ويحتوي على النتيجة البصرية كبيرة. أنا أعمل مع NSLayoutManager وNSTextContainers الزوجين، ووضع خارج النص في عمودين. لأنني باستخدام أواني نصية متعددة (وأنا لست متأكدا من أنني أريد 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
}

ومن ... الكمال.

scroll top