2011-11-15 34 views
7

Tôi đang gắn một UIToolbar vào UITextView làm inputAccessoryView để thêm nút để loại bỏ bàn phím. Điều này hoạt động tốt và có vẻ chính xác khi thiết bị ở chế độ dọc. Nhưng tôi đang gặp khó khăn trong việc tìm cách thay đổi kích thước thanh công cụ thành chiều cao thấp hơn được sử dụng cho thanh công cụ khi thiết bị ở chế độ ngang.Tôi nên nhập inputAccessoryView để thay đổi kích thước khi xoay thiết bị như thế nào?

tôi thêm thanh công cụ trong phương pháp xem văn bản của tôi đại biểu của -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]; 
} 

tôi nhận được hành vi lạ từ mã này trong chế độ phong cảnh, mặc dù. Nếu tôi bắt đầu chỉnh sửa ở chế độ ngang, thanh công cụ có chiều cao ngang nhưng nút Xong được vẽ một nửa khỏi màn hình. Nếu sau đó tôi xoay sang chế độ Chân dung, nút Xong được vẽ ở vị trí chính xác và nút này vẫn ở đúng vị trí khi tôi quay lại chế độ ngang.

Nếu tôi bắt đầu chỉnh sửa ở chế độ dọc, thanh công cụ được vẽ bằng chiều cao dọc, nhưng nút Xong được vẽ ở vị trí chính xác. Nếu sau đó tôi xoay sang chế độ ngang, thanh công cụ vẫn giữ chiều cao dọc, nhưng nút Xong vẫn được vẽ ở vị trí chính xác ít nhất.

Bất kỳ đề xuất nào về cách thay đổi kích thước này khi thiết bị quay? Tôi thực sự hy vọng có một cách tự động hơn là tự cắm các số ma thuật chiều cao vào một trong các sự kiện xoay của bộ điều khiển xem.

+0

Bạn có thể tìm thấy điều này trong một số sử dụng quá: http://stackoverflow.com/a/18926749/1633251 –

Trả lời

2

Đó là một vấn đề khó khăn. Tôi đã giải quyết điều này trong quá khứ bằng cách điều chỉnh khung khi khung nhìn phụ kiện được đặt ra sau khi xoay. Hãy thử một cái gì đó như thế này:

@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 

Và bằng cách sử dụng các RotatingTextInputToolbar thay vì UIToolbar trong mã của bạn, ở trên.

+1

Bạn chắc chắn nên ** không ** được thiết lập 'self.frame' bên trong '-layoutSubviews' vì nó có thể (không) làm cho' layoutSubviews' được gọi là đệ quy. – jbrennan

+0

Mike Katz đúng, jbrenan sai. Nó không gọi layoutSubviews hai lần trong khi thiết lập khung bên trong -layoutSubviews –

1

Voila:

@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

bạn nên cung cấp giải pháp target-c mà không có 'std :: swap' –

Các vấn đề liên quan