从一个位置移动到另一个位置后 UIButton 框架发生变化

2023-12-28

我有 1UIButton in StoryBoard就像下面的屏幕一样,我移动UIButton按照此从一个位置到另一个位置Answer https://stackoverflow.com/questions/45392104/drag-uibutton-without-it-shifting-to-center-swift-3/45392805#45392805.

Edit

我想旋转的另一件事UIButton为此,我尝试了下面的代码,它工作正常,但在旋转之后UIButton当我尝试移动时UIButton然后从一个位置到另一个位置UIButton框架已更改。

Entire UIButton code.

class DraggableButton: UIButton {

var localTouchPosition : CGPoint?
var lastRotation: CGFloat = 0

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    // ROTATION CODE
    let rotate = UIRotationGestureRecognizer(target: self, action:#selector(rotatedView(_:)))
    self.addGestureRecognizer(rotate)
}

// SCROLLING CONTENT FROM ONE POSITION TO ANOTHER
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    let touch = touches.first
    self.localTouchPosition = touch?.preciseLocation(in: self)
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesMoved(touches, with: event)
    let touch = touches.first
    guard let location = touch?.location(in: self.superview), let localTouchPosition = self.localTouchPosition else{
        return
    }

    self.frame.origin = CGPoint(x: location.x - localTouchPosition.x, y: location.y - localTouchPosition.y)
    print(self.frame)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesEnded(touches, with: event)
    self.localTouchPosition = nil
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesCancelled(touches, with: event)
    self.localTouchPosition = nil
}

// ROTATION CODE
@objc func rotatedView(_ sender: UIRotationGestureRecognizer) {
    var originalRotation = CGFloat()
    if sender.state == .began {
        sender.rotation = lastRotation
        originalRotation = sender.rotation
    } else if sender.state == .changed {
        let newRotation = sender.rotation + originalRotation
        sender.view?.transform = CGAffineTransform(rotationAngle: newRotation)
        } else if sender.state == .ended {
            lastRotation = sender.rotation
        }
    }
}

Edit 1

I uploaded issue video. enter image description here

Edit 2

如果我用过UIButton旋转和移动代码分开,然后它可以工作,但是当我编写这两个代码时,它会产生这个问题。


我认为问题在于旋转是围绕视图的中心进行的,因此当您应用旋转时,框架尺寸会增加,从而偏离相对于框架原点的距离。

我可以通过相对于其中心移动视图来解决此问题:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    let touch = touches.first
    guard let location = touch?.location(in: self.superview) else { return }

    // Store localTouchPosition relative to center
    self.localTouchPosition = CGPoint(x: location.x - self.center.x, y: location.y - self.center.y)
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesMoved(touches, with: event)
    let touch = touches.first
    guard let location = touch?.location(in: self.superview), let localTouchPosition = self.localTouchPosition else{
        return
    }

    self.center = CGPoint(x: location.x - localTouchPosition.x, y: location.y - localTouchPosition.y)
    print(self.frame)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从一个位置移动到另一个位置后 UIButton 框架发生变化 的相关文章

  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任
  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 在回调函数中调用目标c函数

    如何在回调函数中调用目标c函数 回调函数 static OSStatus inputRenderCallback void inRefCon AudioUnitRenderActionFlags ioActionFlags const Au
  • 如何在应用程序项目中使用 Cocoa Touch 框架

    我熟悉构建单个 iOS 应用程序 但我坚持使用 Cocoa Touch 框架向多个应用程序共享通用代码 问题 框架的头文件不可见 无法链接到消费应用程序项目 我做了什么 1 我创建了一个名为 libTestFramework 的项目 Coc
  • SceneKit unproject Z 文档解释?

    我正在经历一些 SceneKit 概念 而我试图在脑海中巩固的一个概念是 unprojectPoint 我知道该函数将获取 2D 中的一个点并返回 3D 中的一个点 因此具有正确的 Z 值 当我阅读文档时 我读到了以下内容 method u
  • 为具有多个目标和不同平台的项目编写 Podfile

    我正在准备一个支持 OS X 和 iOS 的 Pod 我的 pod 有一些自己的依赖项 这些依赖项在 podspec 文件中定义 因此我使用 Podfile 来管理我用来开发 pod 和运行测试的项目的依赖项 我正在使用 CocoaPods
  • 如何解决 iOS 6 SDK 中的 hidesBottomBarWhenPushed 行为异常的问题?

    我遇到了中描述的相同问题这个 OpenRadar 问题 http www openradar me 14670329 正如那里所说 摘要 UIViewController的hidesBottomBarWhenPushed属性 对于使用 iO
  • 与新 Apple Music 应用程序中相同的动态状态栏

    是否可以动态着色statusBar这是在新的苹果音乐应用程序 Edit iOS 8 4 中的新 Apple Music 应用程序具有此功能 打开应用程序 选择并播放歌曲 状态栏为白色 向下滑动播放器控制器以查看 我的音乐 控制器 它有黑色状
  • 带约束的嵌套集合视图的意外行为 (Swift 4)

    我的表格视图中有一个单元格 其中包含水平分页集合视图 该集合视图的每个页面内都有一个垂直集合视图 为了避免 滚动滚动 问题 我在垂直集合视图中禁用了垂直滚动 垂直集合视图的单元格计数不是静态的 可以是任意数字 因此 这会产生一个问题 集合视
  • 在情节提要中将 Segue 拖至自身

    我想将一个 Segue 从我的视图控制器拖到其自身 所以我可以推送该特定视图控制器的 无限 实例 我知道如何在代码中执行此操作 即以编程方式实例化视图控制器 但是 我想尽可能使用 segues 我发现了一些在故事板中进行自我延续的 技巧 但
  • 将 Armadillo C++ 库导入 Xcode

    我是 Mac 用户 正在尝试安装和导入 C Armadillo 库 以下是我到目前为止所采取的步骤 1 我从其网站下载了犰狳库 2 我仔细阅读了下载文件中的 Readme txt 文件 解释了如何安装它 3 我使用CMake将犰狳下载文件制
  • 访问 google reader 的 Endpoints API 时出错

    我正在尝试在iPhone APP中实现google reader 到目前为止我已经成功收到了sid and auth 当我尝试使用以下命令调用 Endpoints API 时 问题就出现了GET 这是代码 ASIHTTPRequest re
  • TTTAttributedLabel 可点击截断标记

    我有一个 TTTAttributedLabel 并为其指定了一个自定义属性截断标记 NSAttributedString atributedTruncationToken NSAttributedString alloc initWithS
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • 如何在Sprite Kit中实现鼠标关节?

    我已经在 iOS 上用 Cocos2d Box2d 编写了拖放功能的工作实现 我需要将它移植到 Sprite Kit 逻辑非常基本 当用户触摸屏幕时 找到手指下的精灵 在找到的精灵和场景的物理体之间创建鼠标关节 将关节的目标设置为触摸位置
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • UILabel UILongPressGestureRecognizer 不起作用?

    我怎样才能得到UILongPressGestureRecognizer在 uilabel 当我实现以下代码时 它不会调用该函数 那么请告诉我我做错了什么 UILongPressGestureRecognizer longPress UILo
  • 领域:结果 和列表

    是否可以转换Results
  • 无需越狱即可检测iOS9上哪个应用程序处于前台

    我正在尝试记录用户在 iOS9 上的个人应用程序使用情况 我宁愿它不会使用越狱有限的解决方案 不言自明 在越狱手机上执行此应用程序的变体应该不难 https www andyibanez com create mobilesubstrate

随机推荐

  • Python。如何使用libxml2获取属性值

    我使用的是 MINIDOM 但它不提供 xpath 方法 我现在尝试使用 libxml2 但在检索属性值时遇到问题 我的 xml 摘录如下
  • jersey 2.3.1 和 spring 集成兼容性问题

    我正在尝试创建将使用球衣和弹簧的宁静服务项目设置 我最初下载了 jersey1 8 依赖的 jar 我还得到了 jersey spring 1 8 并且我使用 com sun jersey spi spring container serv
  • 如何使用一对 FrameLabels 制作绘图网格?

    创建行 列 网格图 整个网格具有单个 FrameLabel 的最简单方法是什么 我需要类似的东西 p ListPlot RandomInteger 10 5 Joined gt True Axes gt False Frame gt Tru
  • Google 地图 API 3 搜索框

    我不知道如何在我的谷歌地图中实现搜索框 我有它 用户可以从表单中选择一些内容 然后在地图上加载标记 现在我想添加他们可以使用谷歌搜索框输入城市和州的位置 例如在maps google com上 这可以通过 API v 3 来完成吗 Goog
  • Eclipse:选择不包含任何可以在服务器上运行的资源

    我无法将 Maven Java Web 应用程序项目运行到 Eclipse IDE 中配置的 Tomcat 最初 我可以右键单击该项目并在 tomcat 服务器上运行它 但自从我将项目共享到存储库后 我无法执行此操作 我从存储库中断开了项目
  • 确定 JS AudioContext.analysisrNode 中的频率

    背景 我的目标是创建一个基于 JavaScript 的 Web 应用程序来分析和显示音频源 包括页内源 中的频率信息
  • 当理论规定使用已检查异常时,我是否应该使用相关的内置未检查异常?

    SO 上有很多关于 检查与非检查异常 主题的帖子 这个答案 https stackoverflow com a 19061110 2520359可能是最全面 信息最丰富的 然而 我仍然对遵循那里提出的逻辑感到矛盾 这是有原因的 我正在围绕一
  • 我应该在我的应用程序中包含命令行模式吗?

    出于学习目的 我正在 C 和 winforms 中开发一个类生成应用程序 我认为包含允许在脚本中使用应用程序的命令行模式可能会很好 在我的应用程序中包含命令行模式是一个很好的做法吗 最好有两个不同的程序 一个带有 GUI 一个用于命令行 实
  • 如何使 Flask/Jinja2 加载可执行 zip 存档中的捆绑模板?

    我已将 Flask Web 应用程序打包成可执行的 Python 压缩存档 zipapp https docs python org 3 6 library zipapp html 我在加载模板时遇到问题 Flask Jinja2 无法找到
  • 如果 ASP.NET 破坏了 DIV 的 ID,如何从 javascript 访问该 DIV?

    我有一个包含 div 元素的网页 在页面上 有 javascript 来引用 div document getElementById divId 在另一位开发人员重新设计该页面以使用 ASP 母版页之前 该方法一直运行良好 Now docu
  • 流复制和逻辑复制的区别

    有人能告诉我更多关于 PostgreSQL 中物理复制和逻辑复制之间的区别吗 TL DR 逻辑复制发送逐行更改 物理复制发送磁盘块更改 逻辑复制对于某些任务更好 而物理复制对于其他任务更好 请注意 在 PostgreSQL 12 更新时的当
  • Rails 购物车 - 未添加到当前订单

    这里是 Rails 菜鸟 我正在构建一个基本的购物车 它之前运行良好 在不更改任何代码的情况下 我 git reset hard 到我以前的提交 它正在工作 它就崩溃了 这是细分 Github 仓库 https github com chr
  • 编译引用的dll

    使用VS2005和VB NET 我有一个项目 它是我创建的数据存储的 API 编译时创建api dll 我在同一解决方案中有第二个项目 它有一个对 API 项目的项目引用 编译时将创建wrapper dll 这基本上是特定于应用程序的 AP
  • 显示对象而不是字符串

    在这里 我附上了我的问题的快照和代码 它只向我显示作为对象的内容 但完美地显示组名 这个问题的快照在下面的链接中给出 只需浏览这张图片 http imageupload org d 4DA941521 快照 gt 我想要特定组名称的子数据
  • 使用 kafka 进行 Spark 结构化流处理只会导致一批(Pyspark)

    我有以下代码 我想知道为什么它只生成一批 df spark readStream format kafka option kafka bootstrap servers IP option subscribe Topic option st
  • 如何设计一个数据库来存储属性,通过同义词选择属性

    我正在为房地产应用程序设计一个数据库 事实证明 它比我预期的更复杂 也许我把事情复杂化了 这些问题本质上是由于以下因素的存在造成的 同义词 例如 术语 公寓 公寓和顶层公寓本质上都指的是同一类型的房产 属性 不同的属性类型有不同的属性 例如
  • 批处理:连接变量和字符串以形成输出路径

    我有一个批处理文件 用户在其中输入文件的路径 然后从该路径中提取文件名 我使用该文件名创建一个同名的文件夹 在该文件夹中 我想创建一个 log txt 文件 我在批处理文件中调用的进程可以将其日志消息写入其中 这是代码 set p path
  • 将数据框与从应用函数创建的另一个数据框合并?

    我有一个数据框 df 工资数据 State Annual Salary New York 132826 New Hampshire 128704 California 127388 Vermont 121599 Idaho 120011 还
  • 在 C# 中访问已释放的闭包?

    我正在调查 Microsoft 企业库 数据应用程序块 示例 sln 他们有一个异步读取数据的示例 IAsync 虽然新版本 6 也支持async 但是雷沙珀 或视觉工作室 没关系 向我展示 访问已处理的闭包 首先我将显示图像 这样会更清晰
  • 从一个位置移动到另一个位置后 UIButton 框架发生变化

    我有 1UIButton in StoryBoard就像下面的屏幕一样 我移动UIButton按照此从一个位置到另一个位置Answer https stackoverflow com questions 45392104 drag uibu