2011-11-10 41 views
5

Tôi đang cố gắng tạo hiệu ứng động UITextField nhưng tôi đã bị bắt gặp bởi một vấn đề khó chịu và kỳ lạ. hoạt hình của tôi có trình tự sau đây:Hành vi lạ khi hoạt hình UITextField

first state

Trong trạng thái đầu tiên ứng dụng có UITextField, camera UIButton và hủy UIButton sau khi nút máy ảnh mà không được cho thấy bởi vì nó được được vị trí ra khỏi giới hạn của ứng dụng. Trên thực tế ứng dụng của tôi có 320 chiều rộng và nút hủy nguồn gốc là (350,7)

second state

Trong trạng thái thứ hai, khi chạm người dùng trên UITextField, camera kênh nút alpha được đặt thành 0 và nguồn gốc của nút hủy được đặt thành (247,7).

final state

Các trạng thái cuối cùng cũng giống như nút tiểu bang đầu tiên sau khi người dùng chạm vào nút Return of bàn phím hoặc hủy bỏ.

Trong quá trình xử lý chiều rộng UITextField và nút hủy xuất xứ trong trục x là hoạt ảnh.

Mã của tôi là:

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    barcodeSearchButton.userInteractionEnabled = NO; 
    cancelButton.userInteractionEnabled = NO; 

    CGFloat cancelButtonXOffset = CGRectGetMaxX(barcodeSearchButton.frame) - cancelButton.frame.size.width; 
    CGFloat searchFieldWidth = searchField.frame.size.width - cancelButton.frame.size.width + barcodeSearchButton.frame.size.width; 
    [UIView animateWithDuration:0.3 
     animations:^{ 
      searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldWidth, searchField.frame.size.height); 
      cancelButton.alpha = 1.0;     
      cancelButton.frame = CGRectMake(cancelButtonXOffset, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height); 

      barcodeSearchButton.alpha = 0.0; 

     } 
     completion:^(BOOL finished) { 
      barcodeSearchButton.userInteractionEnabled = NO; 
      cancelButton.userInteractionEnabled = YES; 
     }];  
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    barcodeSearchButton.userInteractionEnabled = NO; 
    cancelButton.userInteractionEnabled = NO; 

    [UIView animateWithDuration:0.3 
       animations:^{ 
        searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldStartWidth, searchField.frame.size.height); 
        cancelButton.alpha = 0.0; 
        cancelButton.frame = CGRectMake(cancelButtonStartX, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height); 
        barcodeSearchButton.alpha = 1.0;     
       } 
       completion:^(BOOL finished) { 
        barcodeSearchButton.userInteractionEnabled = YES; 
        cancelButton.userInteractionEnabled = NO; 
       }];   
} 

Khi hoạt hình được thực hiện cho đến khi nhà nước chính thức CHỈ cho lần đầu tiên, có nghĩa là, người dùng chạm vào UITextField, viết xuống (phần này là quan trọng) một số văn bản về lĩnh vực và sau đó người dùng chạm vào nút quay lại bàn phím vấn đề xuất hiện. Vấn đề là văn bản đã gõ trong UITextField được làm động khi chiều rộng của UITextField cũng được làm động.

Các hình ảnh động hoạt động như dưới đây:

  1. Các UITextField trải dài trở lại giá trị ban đầu của nó.
  2. Hủy lưng nút nguồn gốc ban đầu của nó
  3. nút máy ảnh được thiết lập để 1,0
  4. Các văn bản đánh máy bay từ góc trên bên trái của UITextField và nó vùng đất vào UITextfield đến vị trí mà nó không nên đi.

Vấn đề là bước 4 không nên xảy ra và sự cố xảy ra chỉ một lần. Nếu bắt đầu quá trình một lần nữa (chạm vào uitextfield, gõ một số văn bản, chạm vào phím quay lại) bước 4 không xảy ra.

Tôi dành cả ngày cố gắng giải quyết vấn đề này nhưng tôi đã không thành công.

Trả lời

0

Đặt một số văn bản giữ chỗ trên các lĩnh vực tìm kiếm, _searchField.text = @ "giữ chỗ"

và cũng đặt _searchField.clearsOnBeginEditing = YES;

Hoặc bạn có thể chỉ rõ ra giá trị nếu nó bằng văn bản giữ chỗ của bạn trên textDidBeginEditing

+0

Ngoài ra, sử dụng văn bản thay vì tài sản văn bản giữ chỗ có thể gây rối với màu sắc của bạn, vì vậy bạn sẽ phải khắc phục điều đó lên là tốt. –

0

{chỉnh sửa để cải thiện việc sửa chữa} Tôi có cùng một vấn đề chính xác này, và tiếp tục một số chi tiết cũng như nhỏ hack đó thực sự là sửa chữa nó cho tôi.

Vì vậy, đầu tiên biết thêm chi tiết:

  1. Vấn đề chỉ xảy ra lần đầu tiên hình ảnh động khung mở rộng các UITextField và có được nhập văn bản trong lĩnh vực này. Nếu UITextField được chỉnh sửa lại và các hoạt ảnh tương tự lại xảy ra, sự cố không xảy ra.
  2. searchField.clearsOnBeginEditing = YES; không giải quyết được sự cố.
  3. Tôi đã sử dụng văn bản trình giữ chỗ toàn bộ thời gian vấn đề có quan sát được . Nó không ảnh hưởng đến kết quả.
  4. Thay đổi thuộc tính văn bản cho 1 khung không có tác dụng xóa vấn đề.

Đây là những gì tôi đang làm để sửa chữa nó:

Trong viewDidLoad của tôi, tôi đang thiết lập thuộc tính văn bản đến một không gian duy nhất, sau đó cử một lần chuyển nhượng cho một chuỗi rỗng.

-(void)viewDidLoad { 
    searchField.text = @" "; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     searchField.text = @""; 
    }); 
} 

Sau đó, trong phương pháp của tôi mà co lại và mở rộng UITextField, cũng như di chuyển một nút hủy trên màn hình, tôi kiểm tra nếu đây là một hình ảnh động tức thời và thiết lập thời gian để 0.0f.

- (void)showCancelButton { 
    NSTimeInterval duration = 0.3f; 

    [UIView animateWithDuration:duration animations:^{ 
     CGPoint buttonOrigin = cancelButton.frame.origin; 
     CGSize buttonSize = cancelButton.frame.size; 
     CGFloat buttonTravelDist = buttonSize.width + 10.0f; 
     CGPoint onscreenPos = CGPointMake(buttonOrigin.x - buttonTravelDist, buttonOrigin.y); 

     cancelButton.frame = CGRectMake(onscreenPos.x, onscreenPos.y, buttonSize.width, buttonSize.height); 

     CGPoint fieldOrigin = searchField.frame.origin; 
     CGSize fieldSize = searchField.frame.size; 

     searchField.frame = CGRectMake(fieldOrigin.x, fieldOrigin.y, fieldSize.width - buttonTravelDist, fieldSize.height); 
    }]; 
} 

- (void)hideCancelButton { 
    NSTimeInterval duration = 0.3f; 

    [UIView animateWithDuration:duration animations:^{ 
     CGPoint buttonOrigin = cancelButton.frame.origin; 
     CGSize buttonSize = cancelButton.frame.size; 
     CGFloat buttonTravelDist = buttonSize.width + 10.0f; 
     CGPoint onscreenPos = CGPointMake(buttonOrigin.x + buttonTravelDist, buttonOrigin.y); 

     cancelButton.frame = CGRectMake(onscreenPos.x, onscreenPos.y, buttonSize.width, buttonSize.height); 

     CGPoint fieldOrigin = searchField.frame.origin; 
     CGSize fieldSize = searchField.frame.size; 

     searchField.frame = CGRectMake(fieldOrigin.x, fieldOrigin.y, fieldSize.width + buttonTravelDist, fieldSize.height); 
    }]; 
} 

Điều này đã hoàn toàn khắc phục tình huống của tôi.

6

Cảm ơn câu trả lời của mọi người nhưng tôi đã tìm ra giải pháp một thời gian trước đây. Cách chính xác để bắt đầu hoạt ảnh trong một UITextField, tùy thuộc vào trạng thái bàn phím, sẽ ghi đè các phương thức textFieldShouldBeginEditingtextFieldShouldEndEditing.

Lần thử đầu tiên của tôi là ghi đè textFieldDidBeginEditingtextFieldDidEndEditing để tạo hoạt ảnh. Tôi không biết lý do cho hoạt ảnh hoạt động trong textFieldShouldBeginEditingtextFieldShouldEndEditing nhưng không ở số textFieldDidBeginEditingtextFieldDidEndEditing. Nhưng nó chỉ hoạt động.

My sửa đổi mã phiên bản:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 

    CGFloat cancelButtonXOffset = CGRectGetMaxX(barcodeSearchButton.frame) - cancelButton.frame.size.width; 
    CGFloat searchFieldWidth = searchField.frame.size.width - cancelButton.frame.size.width + barcodeSearchButton.frame.size.width; 
    [UIView animateWithDuration:0.3 
     animations:^{ 
      searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldWidth, searchField.frame.size.height); 
      cancelButton.alpha = 1.0;     
      cancelButton.frame = CGRectMake(cancelButtonXOffset, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height); 

      barcodeSearchButton.alpha = 0.0; 

     } completion:^(BOOL finished) { 
      searchField.clearButtonMode = UITextFieldViewModeAlways; 
     }]; 
    return YES; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField { 
    [UIView animateWithDuration:0.3 
     animations:^{ 
      searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldStartWidth, searchField.frame.size.height); 
      cancelButton.alpha = 0.0; 
      cancelButton.frame = CGRectMake(cancelButtonStartX, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height); 
      barcodeSearchButton.alpha = 1.0;     
     } completion:^(BOOL finished) { 
      searchField.clearButtonMode = UITextFieldViewModeNever; 
     }]; 
    return YES; 
} 
+0

Điều này hoạt động tốt. Sửa một vấn đề khác mà tôi liên quan đến hoạt ảnh UITextFields khi sử dụng UIControlEventEditingDidEnd. Đã chuyển sang thiết lập này và hoạt ảnh đã được sửa. – jasonjwwilliams

+0

Tính năng này không hoạt động nữa trong iOS 8.1 (ít nhất). –