基于一个问题,我有 earlier.

尝试转换标签的简单按钮.我希望它减少0.5,这是有效的,但由于某种原因,它也移动对象,因为它.标签跳到左边,然后转换.

- (IBAction)btnTest:(id)sender
{

    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationoptionCurveEaseInOut animations:^{
        lblTest.transform = CGAffineTransformScale(lblTest.transform,0.5f,0.5f);
    }completion:^(BOOL finished) {
        if(finished){
            NSLog(@"DONE");
        }
    }];
}

解决方法

我认为您正在使用自动布局的问题:在自动布局中,如果您有一个领先的和/或顶级约束,则在使用CGAffineTransformMakeScale进行扩展后,将重新应用前导/顶部约束,并且您的控件将继续你为了确保约束仍然满足.

您可以关闭自动布局(这是简单的答案),也可以:

>等待直到viewDidAppear(因为IB中定义的约束被应用,并且控件将被放置在我们想要的位置,并且其中心属性将是可靠的);
>现在我们有控件的中心,使用NSLayoutAttributeCenterX和NSLayoutAttributeCenterY约束替换主要和最重要的约束,使用中心属性的值来设置NSLayoutConstraint的常量,如下所示.

从而:

// don't try to do this in `viewDidLoad`; do it in `viewDidAppear`,where the constraints
// have already been set

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self replaceLeadingAndTopWithCenterConstraints:self.imageView];
}

// Because our gesture recognizer scales the UIView,it's quite important to make
// sure that we don't have the customary top and leading constraints,but rather
// have constraints to the center of the view. Thus,this looks for leading constraint
// and if found,removes it,replacing it with a centerX constraint. Likewise if it
// finds a top constraint,it replaces it with a centerY constraint.
//
// Having done that,we can Now do `CGAffineTransformMakeScale`,and it will keep the
// view centered when that happens,avoiding weird UX if we don't go through this
// process.

- (void)replaceLeadingAndTopWithCenterConstraints:(UIView *)subview
{
    CGPoint center = subview.center;

    NSLayoutConstraint *leadingConstraint = [self findConstraintOnItem:subview
                                                             attribute:NSLayoutAttributeLeading];
    if (leadingConstraint)
    {
        NSLog(@"Found leading constraint");

        [subview.superview removeConstraint:leadingConstraint];

        [subview.superview addConstraint:[NSLayoutConstraint constraintWithItem:subview
                                                                      attribute:NSLayoutAttributeCenterX
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:subview.superview
                                                                      attribute:NSLayoutAttributetop
                                                                     multiplier:1.0
                                                                       constant:center.x]];
    }

    NSLayoutConstraint *topConstraint = [self findConstraintOnItem:subview
                                                         attribute:NSLayoutAttributetop];

    if (topConstraint)
    {
        NSLog(@"Found top constraint");

        [subview.superview removeConstraint:topConstraint];

        [subview.superview addConstraint:[NSLayoutConstraint constraintWithItem:subview
                                                                      attribute:NSLayoutAttributeCenterY
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:subview.superview
                                                                      attribute:NSLayoutAttributeLeft
                                                                     multiplier:1.0
                                                                       constant:center.y]];
    }
}

- (NSLayoutConstraint *)findConstraintOnItem:(UIView *)item attribute:(NSLayoutAttribute)attribute
{
    // since we're looking for the item's constraints to the superview,let's
    // iterate through the superview's constraints

    for (NSLayoutConstraint *constraint in item.superview.constraints)
    {
        // I believe that the constraints to a superview generally have the
        // `firstItem` equal to the subview,so we'll try that first.

        if (constraint.firstItem == item && constraint.firstAttribute == attribute)
            return constraint;

        // While it always appears that the constraint to a superview uses the
        // subview as the `firstItem`,theoretically it's possible that the two
        // Could be flipped around,so I'll check for that,too:

        if (constraint.secondItem == item && constraint.secondAttribute == attribute)
            return constraint;
    }

    return nil;
}

您的实现细节可能会有所不同,具体取决于您如何定义要缩放的控件的约束(在我的情况下,引导和顶部基于超级视图,这使得它更容易),但希望它可以说明解决方案,去除这些约束,并根据中心添加新约束.

如果您不想通过查找有问题的约束来迭代,就像上面所述,为顶层和前导约束定义一个IBOutlet,这大大简化了过程.这个示例代码是从一个项目中获取的,由于各种原因,我无法使用IBOutlet进行NSLayoutConstraint引用.但是使用IBOutlet引用的约束绝对是一个更简单的方法(如果你坚持使用自动布局).

例如,如果您进入Interface Builder,您可以突出显示所涉及的约束,并将控件拖到助手编辑器中,以使您的IBOutlet:

如果你这样做,而不是迭代所有的约束,你现在可以说,例如:

if (self.imageViewVerticalConstraint)
{
    [self.view removeConstraint:self.imageViewVerticalConstraint];

    // create the new constraint here,like shown above
}

坦白说,我希望Interface Builder有能力立即开始定义这些约束(即,而不是“superview”左边的控制领先“约束,”superview“左边的控制中心)约束),但是我不要以为可以在IB中完成,所以我以编程方式改变了我的约束.但是,通过这个过程,我现在可以扩展控制,而不是因为约束而在我身上移动.

如0x7fffffff所示,如果将CATransform3DMakeScale应用于图层,则它不会自动应用约束,因此您将不会看到它像将CGAffineTransformMakeScale应用于视图一样移动.但是,如果您做任何事情来重新应用约束(setNeedsLayout或对任何UIView对象进行任何更改可能会导致重新应用约束),视图将在您的身上移动.因此,如果在重新应用约束之前将层的变换恢复为身份标识,则可能会“潜入”,但关闭自动布局或修复约束可能最为安全.

iOS:CGAffineTransformScale移动我的对象的更多相关文章

  1. ios – 将UIViewController视图属性设置为不带有storyboard / nib的自定义UIView类

    或者上面的代码片段是推荐的吗?

  2. ios – 如何在父视图上添加子视图控制器的视图

    再现.从而:

  3. ios – UIView-Encapsulated-Layout-Height和Container View

    我怎么能跳过它?

  4. ios – 使用自动布局的基于百分比的保证金

    我只想让左边距为父视图宽度的0.75%.谢谢.解决方法你想要的是sview的左边是在视图左边的某个点,你写的是你希望sview的左边是视图宽度的某个点,这不是一个正确的布局属性配对作为你的错误说.这是你需要做的:希望能帮助到你!

  5. [anyObject] 类型推断 Type Casting

    在swift中,如果遍历一个集合,可能就需要用到类型推断方式二:适合多种类型的混合,在for循环里,如果是多种类型,就进行多种类型的判断添加if-else

  6. AutoLayout Swift demo

    importUIKitimportSwiftclassViewController:UIViewController{overridefuncviewDidLoad(){super.viewDidLoad()letv1=UIView()letv2=UIView()v1.backgroundColor=UIColor.redColor()v2.backgroundColor=UIColor.blue

  7. swift开发笔记5 - 设置屏幕方向和代码控制布局

    最后在代码中获取当前屏幕宽度,计算适当的间距,然后更新约束的constant:

  8. 相对布局日志

    在相对布局过程中,会遇到各种布局的问题,整理如下:1.整体居中-*该效果中,由于所有的子视图都没有居中,因此不能通过中心往两侧布局的方式整体居中。思路是将各imageView从左往右按1-7编号,每个imageView的左边对齐前一个imageView的右边。然后将父View的centerX及centerY对齐整个view的centerX/centerY,父view的bottom对齐最底两个imageView任一个的bottom。

  9. Swift开发:NSLayoutConstraint纯代码实现自动布局-初级篇

    .addConstraint//父控件添加约束效果图:

  10. Swift2.x 代码添加约束

    想实现一个效果:在UIWebView上添加另外一个控件UIButton。拖动UIWebView控件然里面的UIButton也跟着滑动我的做法是这样的:我用代码创建了一个UIButton,然后使用addSubView()添加到一个UIWebView中,拖动UIWebView,里面的button不跟着动我在交流群问了一下IOS开发者,有人说需要给UIButton添加约束才行。.addConstraint父控件添加约束下边约束letbottom:Bottom,129)">addConstraint父控件添加约束

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部