سؤال

لديّ uitableviewcell مخصص يحتوي على العديد من Uibuttons. يكون موضع إطار كل زر بالنسبة لعرض الخلية. لقد قمت بتعيين AutoresizingMask = uiViewAutoresizationFlexibleWidth بحيث يقوم بضبط عرض الخلية ويوضع الزر بشكل صحيح عندما يبدأ التطبيق بالجهاز إما في وضع المناظر الطبيعية أو البورتريه.

المشكلة هي عندما يتم تدوير الجهاز من وضع واحد إلى آخر ، لا تقوم الأزرار بضبط المواضع لأن uitableViewCell قابلة لإعادة الاستخدام. بمعنى آخر ، لا يتم تهيئة الخلية استنادًا إلى عرض Uitalbeview الجديد لأن وظيفة الخلية initwithstyle تسمى قبل تدوير الجهاز ولا يتم استدعاؤها مرة أخرى بعد دوران الجهاز. أي اقتراحات؟

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

المحلول 2

بعد قضاء ساعات من البحث (بما في ذلك المنشورات في هذا الموقع) ، لم أتمكن من العثور على أي حلول. لكن المصباح الكهربائي يتحول فجأة. والحل بسيط جدا. ما عليك سوى اكتشاف ما إذا كان اتجاه الجهاز هو المناظر الطبيعية أو وضع الصورة وتحديد إعادة reusablecellidentifier باسم مختلف لكل منهما.

static NSString*Identifier;

if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) {
                Identifier= @"aCell_portrait";
            }
            else Identifier= @"DocumentOptionIdentifier_Landscape";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

نصائح أخرى

نظرًا لأن UitableViewCell هي أيضًا Uiview ، يمكنك تجاوز طريقة setFrame. في كل مرة تدور فيها طريقة عرض الجدول الخاصة بك ، سيتم استدعاء هذه الطريقة لجميع الخلايا.

-(void)setFrame:(CGRect)frame
{
    [super setFrame:frame];

    //Do your rotation stuffs here :)
} 

الإجابة السابقة لديها مشكلة خطيرة. يجب عليك استخدام [UIApplication sharblication] .statusbarororientation بدلاً من [uidevice currebtdevice]. التبعية لأن اتجاه الجهاز لا علاقة له بتوجيه الواجهة - اتجاه الجهاز هو دوران مادي استنادًا إلى مقياس التسارع.

تعمل الإجابة المحددة مثل سحر في إصدارات iOS القديمة. لنظام التشغيل iOS 6.0 ، استخدمت الكود التالي:

static NSString *Identifier;
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) {
    Identifier=@"aCell_portrait";
}
else {
    Identifier=@"DocumentOptionIdentifier_Landscape";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

ستحتاج إلى إصلاح عرض إطار الخلايا الخاصة بك (على افتراض أن الارتفاع هو نفسه في وضع الصورة والمناظر الطبيعية) داخلك cellForRowAtIndexPath طريقة. هذا ما يعمل هنا. اعتدت على إنشاء TableViewCell مخصص مع IB ويتم تهيئة دائمًا لعرض 320 بكسل. مع تحديد الإطار الذي يعمل كما هو متوقع ، حتى لو تم إعادة استخدام الخلية من قائمة الانتظار.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 ...
 UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 if (cell == nil) {
    // create cell here...
 }

 // Adjust cell frame width to be equal to tableview frame width
 cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height);
 ...
}

واجهت مشكلة مماثلة وساعدني هذا المنشور. في حالتي ، لدي فئة مخصصة معلنة في ملف منفصل ، وفي هذا الملف لدي الرمز التالي في layoutSubviews:

//PORTRAIT CELL
if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && 
    [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight)
{
    //build the custom content views for portrait mode here
}
else
{
    //build the custom content views for landscape mode here
}

ثم في وحدة التحكم الخاصة بي أنا فقط تنفذ willAnimateRotationToInterfaceOrientation: وأرسل reloadData رسالة إلى عرض الجدول الخاص بي.

مع هذا ليس علي لمس cellForRow طريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top