2010-03-23 38 views
7

Tôi đang cố gắng chuyển đổi UISearchBar, như trong Mobile Safari: chạm vào trường tìm kiếm và nó phát triển trong khi trường vị trí co lại.Hoạt ảnh động của hoạt ảnh UIView nhưng không phải chiều rộng

Hoạt ảnh hiện tại của tôi để thay đổi chiều rộng và vị trí của trường tìm kiếm chỉ làm động vị trí: ngay trước khi trang trình bày đến đúng vị trí, nó chỉ đơn giản là chụp nhanh với chiều rộng phù hợp. Đây là mã của tôi:

[UIView beginAnimations:@"searchGrowUp" context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
[UIView setAnimationDuration:0.5f]; 
[UIView setAnimationDelegate:self]; 

CGFloat findFieldWidth = findField.frame.size.width; 
CGFloat urlFieldWidth = urlField.frame.size.width; 
CGRect findFieldFrame = findField.frame; 
CGRect urlFieldFrame = urlField.frame; 

findFieldFrame.origin.x = findFieldFrame.origin.x - 150.0f; 
findFieldFrame.size.width = findFieldWidth + 150.0f; 
urlFieldFrame.size.width = urlFieldWidth - 150.0f; 

urlField.frame = urlFieldFrame; 
findField.frame = findFieldFrame; 

[UIView commitAnimations]; 

Tôi đã sửa đổi mã này một chút vì mục đích trình bày ở đây, nhưng tôi hy vọng điều này sẽ cho ý chính.

Bất kỳ dự đoán nào về lý do tại sao điều này xảy ra sẽ được đánh giá cao!

Chúc mừng, Aaron.

+0

Điều này không tốt cho Macinsite! :> –

Trả lời

12

I figured it out nhờ vào bài đăng này: Changing the size of the UISearchBar TextField?

Hóa ra nội dung của một UISearchBar không thay đổi kích thước đúng cách cùng với lớp ngoài. Vì vậy, bạn phải gọi -layoutSubviews: trong khối hoạt hình sau khi khung được đặt trên thanh tìm kiếm. Vì vậy, khối kết thúc như sau:

[findField setFrame:CGRectMake(findField.bounds.origin.y, findField.bounds.origin.y, findFieldWidth, findField.bounds.size.height)]; 
[findField layoutSubviews]; 

[UIView commitAnimations]; 

Đạo cụ cho Nick Farina!

1

Xin lỗi lỗi này hơi cũ nhưng tôi đã gặp sự cố tương tự. Tôi không muốn sử dụng layoutSubviews vì tài liệu cho biết bạn không nên gọi trực tiếp phương thức đó.

Tôi đã làm gì để giải quyết vấn đề của mình là gọi số sizeToFit trên tiểu sử trong khối hoạt ảnh.

+0

Không hoạt động với tôi - iOS 5, iPhone 4S. –

+0

Tôi gặp vấn đề tương tự với UITextView. Đây là câu trả lời duy nhất giải quyết vấn đề cho tôi. – Fireandlight27

7

Tôi đã gặp sự cố tương tự khi cố gắng tạo hoạt ảnh cho chiều rộng của UISearchBar.

Trên iOS 4 và sau đó, tôi thấy rằng việc sử dụng UIViewAnimationOptionLayoutSubviews như một lựa chọn cho

+[UIView animateWithDuration:delay:options:animations:completion:] 

cố định nó.

+0

Tùy chọn này (và câu trả lời của bạn) rất được hoan nghênh ... Cảm ơn – MiKL

3

Câu trả lời được chấp nhận hoạt động nhưng theo tài liệu của Apple bạn "không nên gọi phương thức này". Giải pháp sạch là sử dụng phương pháp layoutIfNeeded:

[UIView animateWithDuration:UINavigationControllerHideShowBarDuration 
         delay:0.f 
        options:UIViewAnimationOptionCurveEaseInOut 
       animations:^{ 

    [searchBar setFrame: ... 
    [searchBar layoutIfNeeded]; 

    ... 

Tận hưởng!

+0

Câu trả lời này đã giải quyết được vấn đề này. Cảm ơn – Vinh

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