繁体   English   中英

动画UISearchBar框架的宽度

[英]Animating the width of UISearchBar frame

是否可以为UISearchBar的帧宽设置动画? 我发现当我应用uiview动画来扩大搜索栏的界限时,它会立即弹出到最终结果,好像该对象在内部控制它的动画效果并且不允许我顺利地应用我自己的动画。

如果我为位置设置动画,它会平稳移动,但我怀疑文本输入根据取消按钮的存在进行调整这一事实可能意味着我们没有公共访问权限通过UIView动画设置宽度动画。 下面的示例代码段将条形图从x = 0滑动到100,但将宽度弹出为600像素宽。

CGRect searchBarFrame = self.searchViewController.searchBar.frame;
searchBarFrame.origin.x = 100;
searchBarFrame.size.width = 600;
[UIView animateWithDuration:1.0 
                      delay:0.0 
                    options:0 
                 animations:^{
                     self.searchViewController.searchBar.frame = searchBarFrame;
                 }
                 completion:^(BOOL completion){
                 }];

由于内部视图强制调整大小以忽略动画,因此UISearchBar存在“问题”。 但是,这可以通过使用 - layoutSubviews来克服。 我在下面的项目中包含了扩展和合同代码

[UIView animateWithDuration:.3
                 animations:^ {
                     CGRect newBounds = locationSearch.frame;
                     newBounds.size.width += 215; //newBounds.size.width -= 215; to contract
                     locationSearch.frame = newBounds;
                     [locationSearch layoutSubviews];
                 }];

希望这可以帮助。

仅供参考,您可以使用UIViewAnimationOption而不是显式调用layoutsubviews ,因此代码看起来像这样。

[UIView animateWithDuration:0.5
                              delay:0
                            options:UIViewAnimationOptionLayoutSubviews
                         animations:^{
                             //Set the frame you want to the search bar
                         }
                         completion:^(BOOL finished) {

                         }];

这是如何克服swift中 左侧的放大

(当用户开始/结束编辑时,此代码将放大/缩小左侧的searchBar 93像素)


  1. SharedNavigationbBar是实现UISearchBarDelegate的UIView
  2. searchBarWidth是包含UISearchBar宽度的约束的出口

  1. 故事板或nib文件上必须存在自动布局约束,以允许调整左侧的大小。 在这种情况下,neighbord left组件是UIButton

在此输入图像描述在此输入图像描述


  1. 将以下代码添加为扩展名或在类中添加以执行动画调整大小。

extension SharedNavigationBar: UISearchBarDelegate
{
//amount of pixels to enlarge to the left
 private var offsetSearchBarLeft:CGFloat
    {
    get {
        return 93
    }
 }

///Enlarges search bar
 func searchBarTextDidBeginEditing(searchBar: UISearchBar) {

   self.animateSearchBar(self.searchBar, enlarge: true)
 }

///Shrinks search bar
 func searchBarTextDidEndEditing(searchBar: UISearchBar) {

   self.animateSearchBar(self.searchBar, enlarge: false)
 }

//shrinks or enlarge the searchbar (this will be the function to call inside the animation)
 private func animateSearchBar(searchBar:UISearchBar, enlarge:Bool)
 {
     ///Important here, for this to work, the option and the searchbar size must be handled this way
    UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.LayoutSubviews, animations: { [weak self] () -> Void in

    let multiplier: CGFloat = enlarge ? 1 : -1

    let origin = searchBar.frame.origin.x + self!.offsetSearchBarLeft * multiplier
    let width = searchBar.frame.width + self!.offsetSearchBarLeft * multiplier

    //This Block of code, setting the new frame, needs to be inside the animation in order to work
    var newBounds:CGRect  = searchBar.frame;
    newBounds.origin.x = origin
    newBounds.size.width = width

    //Sets the new frame
    self?.searchBarWidth.constant = width
    searchBar.frame = newBounds

   }, completion: nil)
 }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM