2011-11-15 13 views
7

मैं अपने UITextView पर inputAccessoryView के रूप में कीबोर्ड को खारिज करने के लिए एक बटन जोड़ने के लिए UIToolbar संलग्न कर रहा हूं। यह बहुत अच्छा काम करता है और यह डिवाइस सही होता है जब डिवाइस पोर्ट्रेट मोड में होता है। लेकिन डिवाइस को लैंडस्केप मोड में होने पर टूलबार के लिए उपयोग की जाने वाली निचली ऊंचाई पर टूलबार का आकार बदलने का तरीका समझने में मुझे परेशानी हो रही है।डिवाइस को घूर्णन करते समय आकार बदलने के लिए मुझे अपना इनपुट कैसे प्राप्त करना चाहिए?

मैं अपने पाठ दृश्य के प्रतिनिधि के -textViewShouldBeginEditing: विधि में उपकरण पट्टी जोड़ रहा:

if (!textView.inputAccessoryView) { 
    UIToolbar *keyboardBar = [[UIToolbar alloc] init]; 
    keyboardBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin; 
    keyboardBar.barStyle = UIBarStyleBlackTranslucent; 

    UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissKeyboard:)]; 
    [keyboardBar setItems:[NSArray arrayWithObjects:spaceItem, doneButton, nil]]; 
    [spaceItem release]; 
    [doneButton release]; 

    [keyboardBar sizeToFit]; 

    textView.inputAccessoryView = keyboardBar; 
    [keyboardBar release]; 
} 

मैं लैंडस्केप मोड में इस कोड से अजीब व्यवहार मिलता है, हालांकि। यदि मैं लैंडस्केप मोड में संपादन करना शुरू करता हूं, तो टूलबार में लैंडस्केप ऊंचाई होती है लेकिन स्क्रीन पर आधा बटन खींचा जाता है। यदि मैं पोर्ट्रेट मोड में घुमाता हूं, तो पूर्ण स्थान सही स्थान पर खींचा जाता है, और जब मैं लैंडस्केप मोड पर वापस घूमता हूं तो यह सही स्थान पर रहता है।

यदि मैं पोर्ट्रेट मोड में संपादन करना शुरू करता हूं, तो टूलबार चित्र की ऊंचाई के साथ खींचा जाता है, लेकिन पूर्ण स्थान सही स्थान पर खींचा जाता है। यदि मैं फिर लैंडस्केप मोड में घुमाता हूं, तो टूलबार पोर्ट्रेट ऊंचाई बना रहता है, लेकिन हो गया बटन अभी भी सही स्थिति में सही स्थिति में खींचा जाता है।

डिवाइस घुमाए जाने पर इसका आकार बदलने के लिए कोई सुझाव कैसे प्राप्त करें? मैं वास्तव में उम्मीद कर रहा हूं कि व्यू कंट्रोलर के घूर्णन कार्यक्रमों में से एक में ऊंचाई जादू संख्याओं में मैन्युअल रूप से प्लगिंग करने से अधिक स्वचालित तरीका है।

+0

आप कुछ उपयोग की यह भी खोज सकते हैं: http://stackoverflow.com/a/18926749/1633251 –

उत्तर

2

यह एक कठिन समस्या है। घूर्णन के बाद सहायक दृश्य को रखे जाने पर मैंने फ्रेम को समायोजित करके अतीत में इसे हल कर लिया है। ऊपर

@interface RotatingTextInputToolbar : UIToolbar 
@end 

@implementation RotatingTextInputToolbar 

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 
    CGRect origFrame = self.frame; 
    [self sizeToFit]; 
    CGRect newFrame = self.frame; 
    newFrame.origin.y += origFrame.size.height - newFrame.size.height; 
    self.frame = newFrame; 

} 
@end 

और अपने कोड में UIToolbar के बजाय RotatingTextInputToolbar का उपयोग कर,: कुछ इस तरह की कोशिश करो।

+1

आप निश्चित रूप से ** नहीं ** 'self.frame' की स्थापना की जानी चाहिए '-layoutSubviews' के अंदर जैसा कि यह कर सकता है (करता है) 'लेआउटस्यूव्यूव्यू' को रिकर्सिवली कहलाता है। – jbrennan

+0

माइक काट्ज़ सही है, जेब्रेन गलत है। यह लेआउटसब्यूव्स को दो बार अंदर सेट करने के दौरान कॉलब्यूव्यूज़ को कॉल नहीं करता है --आउटआउट –

1

देखा:

@interface AccessoryToolbar : UIToolbar @end 

@implementation AccessoryToolbar 

-(id)init 
{ 
    if (self = [super init]) 
    { 
     [self updateSize]; 
     NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; 
     [nc addObserver:self selector:@selector(orientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:NULL]; 
    } 
    return self; 
} 

-(void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 

-(void)orientationDidChange:(NSNotification*)notification 
{ 
    [self updateSize]; 
} 

-(void)updateSize 
{ 
    bool landscape = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]); 
    CGSize size = UIScreen.mainScreen.bounds.size; 
    if (landscape != size.width > size.height) 
     std::swap(size.width, size.height); 
    if (size.height <= 320) 
     size.height = 32; 
    else 
     size.height = 44; 
    self.frame = CGRectMake(0, 0, size.width, size.height); 
} 

@end 
+0

आपको 'std :: swap' के बिना उद्देश्य-सी समाधान प्रदान करना चाहिए –

संबंधित मुद्दे