用 UITextField 替换 UiNavigationItem.Title 的错误布局

wrong Layout for replacing UiNavigationItem.Title with UITextField

我不会用 UITextfield 替换 UINavigationItem.title。

为了做到这一点,我在 viewDidLoad 中添加了 TextField

UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 150, 30)];
textField.text = @"";
textField.placeholder = @"set title here";
textField.font = [UIFont fontWithName:@"Futura-Medium" size:19.0];
textField.textColor = [UIColor whiteColor];
textField.textAlignment = NSTextAlignmentCenter;
textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;
textField.translatesAutoresizingMaskIntoConstraints = NO;
textField.delegate = self;

self.navigationItem.titleView = textField;

但我在执行 TextField 的定位和大小时遇到​​问题:

我希望 TextField 的行为类似于 NavigationItem.title

有什么想法吗?

提前致谢

---这是我的class---

#import "CustomCategoryViewController.h"

@interface CustomCategoryViewController ()<UITextFieldDelegate>

@end

@implementation CustomCategoryViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.

  NSLog(@"%f",self.navigationController.navigationItem.titleView.frame.size.height);

UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 150, 30)];
textField.text = @"";
textField.placeholder = @"set title here";
textField.font = [UIFont fontWithName:@"Futura-Medium" size:19.0];
textField.textColor = [UIColor whiteColor];
textField.textAlignment = NSTextAlignmentCenter;
textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;
textField.translatesAutoresizingMaskIntoConstraints = NO;
textField.delegate = self;

self.navigationItem.titleView = textField;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - TextField Delegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet  *set = [NSCharacterSet newlineCharacterSet];

    if ([string rangeOfCharacterFromSet:[set invertedSet]].location == NSNotFound){

        [textField endEditing:YES];
    }

    return YES;
}

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    //self.commonName = @"";
    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    if (textField.text && ![textField.text isEqualToString:@""]) {
        CGRect rect = [textField textRectForBounds:textField.bounds];
        [textField setBounds:CGRectMake(0, 0, rect.size.width, rect.size.height)];
    }
    else{
        CGRect rect = [textField placeholderRectForBounds:textField.bounds];
        [textField setBounds:CGRectMake(0, 0, rect.size.width, rect.size.height)];
    }
}

#pragma mark - Keyboard

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}

- (IBAction)textFieldReturn:(id)sender
{
    [sender resignFirstResponder];
}

#pragma mark - Interface Orientation


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    // Code here will execute before the rotation begins.
    // Equivalent to placing it in the deprecated method -[willRotateToInterfaceOrientation:duration:]

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {

        // Place code here to perform animations during the rotation. You can leave this block empty if not necessary.
        dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
            //Background Thread
            dispatch_async(dispatch_get_main_queue(), ^(void){

            });
        });

    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {

        // Code here will execute after the rotation has finished.
        // Equivalent to placing it in the deprecated method -[didRotateFromInterfaceOrientation:]

    }];
}
/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

目前您的 textField 宽度为 150,其内容保持在中间,因此当您的 barButton 较长时,您会看到文本漂浮到一侧。

您需要设置 textField 边界以适应 textplaceHolder 每次编辑 textField

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    if (textField.text && ![textField.text isEqualToString:@""]) {
         CGRect textRect = [textField.text boundingRectWithSize:CGSizeMake(300,30)
                                options:NSStringDrawingUsesLineFragmentOrigin
                                attributes:@{NSFontAttributeName:textField.font}
                                context:nil];

         [textField setBounds:CGRectMake(0, 0, textRect.size.width, textRect.size.height)];
    }
    else{
         CGRect textRect = [textField.placeholder boundingRectWithSize:CGSizeMake(300,30)
                                options:NSStringDrawingUsesLineFragmentOrigin
                                attributes:@{NSFontAttributeName:textField.font}
                                context:nil];

         [textField setBounds:CGRectMake(0, 0, textRect.size.width, textRect.size.height)];
    }
}

在此之后,您的 textField 的大小将完全符合其内容,并且它将保持在 navigationBar 的中心。