- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为 ChartView
的容器,它包含我星球的 UIImageView
。我以编程方式添加我的行星,然后为它们分配 UIPanGestureRecognizer
。据我了解,我需要将委托(delegate)转发到我的容器 ViewController,然后实现我的 draggedView()
函数。
我成功地进入了那个函数,但是 UIImageView 并没有在视觉上移动,即使我在 draggedView() 中打印它的新位置。我做错了什么?
**** 已更新 ****
import UIKit
extension FloatingPoint {
var degreesToRadians: Self { return self * .pi / 180 }
var radiansToDegrees: Self { return self * 180 / .pi }
}
extension CGFloat {
static func random() -> CGFloat {
return CGFloat(arc4random()) / CGFloat(UInt32.max)
}
}
extension UIColor {
static func random() -> UIColor {
return UIColor(red: .random(),
green: .random(),
blue: .random(),
alpha: 1)
}
}
class FirstViewController: UIViewController, UIGestureRecognizerDelegate {
@IBOutlet weak var chartView: ChartView!
private var planets: [Planet] = []
override func viewDidLoad() {
super.viewDidLoad()
self.chartView.delegate = self
self.chartView.setSegmentValues(
values: [50, 50, 50,50,50,50,50,50,50,50,50,50],
totals: [50, 50, 50,50,50,50,50,50,50,50,50,50])
self.chartView.addPlanet(fullAngle: CGFloat(180),name: "test")
}
@objc func didPan(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: self.view)
if let view = sender.view {
view.center = CGPoint(x:view.center.x + translation.x,
y:view.center.y + translation.y)
}
sender.setTranslation(CGPoint.zero, in: self.view)
print("Pos: \(translation.x)- \(translation.y)")
}
}
这是图 TableView :
import UIKit
import Foundation
@IBDesignable class ChartView: UIView {
var delegate: UIGestureRecognizerDelegate?
// Static value
private let ELEMENT_COLOR: [UIColor] = [UIColor.red, UIColor.gray, UIColor.blue, UIColor.yellow, UIColor.cyan]
//Values for each segment
private var segmentValues : [Float]
//Total for each segment
private var segmentTotals : [Float]
//Sum of each segmentTotals element
private var segmentTotalAll : Float
override init(frame: CGRect) {
segmentValues = []
segmentTotals = []
segmentTotalAll = 0
super.init(frame: frame)
self.isUserInteractionEnabled = true
self.backgroundColor = UIColor.clear
}
required init?(coder aDecoder: NSCoder) {
segmentValues = []
segmentTotals = []
segmentTotalAll = 0
super.init(coder: aDecoder)
self.isUserInteractionEnabled = true
self.backgroundColor = UIColor.clear
}
override func draw(_ rect: CGRect) {
// Base Circle
UIColor.random().setFill()
let outerPath = UIBezierPath(ovalIn: rect)
outerPath.fill()
// Semicircles
//self.frame isn't defined yet, so we can't use self.center
let viewCenter = CGPoint(x: rect.width / 2, y: rect.height / 2)
var i: Int = 0
var lastAngle :Float = 0.0
let baseCircleRadius = rect.width / 2 - 1.5
let centerCircleRadius = rect.width / 2 * 0.4
//value : current number
for value in segmentValues {
//total : total number
let total = segmentTotals[i]
//offsetTotal : difference between Base Circle and Center Circle
let offset = baseCircleRadius - centerCircleRadius
//radius : radius of segment
let radius = CGFloat(value / total) * offset + centerCircleRadius
//startAngle : start angle of this segment
let startAngle = lastAngle
//endAngle : end angle of this segment
let endAngle = lastAngle + total / segmentTotalAll * 360.0
//color : color of the segment
let color = self.ELEMENT_COLOR[i % 4]
color.setFill()
let midPath = UIBezierPath()
midPath.move(to: viewCenter)
midPath.addArc(withCenter: viewCenter, radius: CGFloat(radius), startAngle: CGFloat(startAngle.degreesToRadians), endAngle: CGFloat(endAngle.degreesToRadians), clockwise: true)
midPath.close()
UIColor.black.setStroke()
midPath.lineWidth = 2
midPath.stroke()
midPath.fill()
lastAngle = endAngle
i += 1
}
//Center circle
UIColor.white.setFill()
let centerPath = UIBezierPath(ovalIn: rect.insetBy(dx: rect.width / 2 * 0.4, dy: rect.height / 2 * 0.4))
UIColor.black.setStroke()
centerPath.lineWidth = 3
centerPath.stroke()
centerPath.fill()
}
//Sets all the segment members in order to draw each segment
func setSegmentValues(values : [Int], totals : [Int]){
//Must be equal lengths
if values.count != totals.count{
return;
}
//Set the colors
segmentTotalAll = 0
for total in totals {
segmentTotalAll += Float(total)
segmentTotals.append(Float(total))
}
for val in values {
segmentValues.append(Float(val))
}
}
public func addPlanet(fullAngle: CGFloat, name: String) {
let planetPosition: CGPoint = self.getPosition(center: CGPoint(x: self.frame.width/2, y: self.frame.height/2), radius: self.bounds.width/4, angle: fullAngle)
let planetImageView: UIImageView = UIImageView()
planetImageView.frame = CGRect(origin: planetPosition, size: CGSize(width: 10, height: 10))
planetImageView.center = planetPosition
planetImageView.backgroundColor = .blue
self.addSubview(planetImageView)
let panGesture = UIPanGestureRecognizer(target: self.delegate, action: #selector(FirstViewController.didPan(sender:)))
panGesture.delegate = self.delegate
planetImageView.isUserInteractionEnabled = true
planetImageView.addGestureRecognizer(panGesture)
// paint curve for sun
let path = UIBezierPath(arcCenter: CGPoint(x: self.frame.width/2, y: self.frame.height/2), radius: self.bounds.width/4, startAngle: CGFloat(0), endAngle: fullAngle.degreesToRadians, clockwise: true)
let animation = CAKeyframeAnimation(keyPath: #keyPath(CALayer.position))
animation.duration = 1.5
animation.isRemovedOnCompletion = false // do not remove the animation effect, no state changes.
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
animation.fillMode = kCAFillModeBoth // keep to value after finishing
animation.path = path.cgPath
planetImageView.layer.add(animation, forKey: animation.keyPath)
}
private func getPosition(center: CGPoint, radius: CGFloat, angle: CGFloat) -> CGPoint {
return CGPoint(x: center.x + radius * cos(angle.degreesToRadians), y: center.y + radius * sin(angle.degreesToRadians))
}
public func addCenterCircle(){
let centerCircle = UIBezierPath(arcCenter: CGPoint(x: self.bounds.width/2,y: self.bounds.height/2), radius: self.bounds.width/4, startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = centerCircle.cgPath
//change the fill color
shapeLayer.fillColor = UIColor.white.cgColor
//you can change the stroke color
shapeLayer.strokeColor = UIColor.black.cgColor
//you can change the line width
shapeLayer.lineWidth = 1
self.layer.addSublayer(shapeLayer)
}
}
最佳答案
我创建了一个简单的蓝色方 block ,然后添加了一个红色星球。您可以平移一个红色方 block 。这是以编程方式编写的示例。
import UIKit
class ViewController: UIViewController, UIGestureRecognizerDelegate {
private lazy var chartView: ChartView = {
let cv = ChartView(frame: CGRect(x: 0,
y: 0,
width: view.frame.width - 20,
height: view.frame.height/2))
cv.center = view.center
// Important
cv.panGesture.delegate = self
return cv
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(chartView)
chartView.addPlanet(fullAngle: 50, name: "Mars")
}
}
class ChartView: UIView {
lazy var panGesture: UIPanGestureRecognizer = {
let v = UIPanGestureRecognizer(target: self, action: #selector(didPan(sender:)))
return v
}()
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .blue
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc private func didPan(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: self)
if let view = sender.view {
view.center = CGPoint(x:view.center.x + translation.x,
y:view.center.y + translation.y)
}
sender.setTranslation(CGPoint.zero, in: self)
print("Pos: \(translation.x)- \(translation.y)")
}
func addPlanet(fullAngle: CGFloat, name: String) {
let planetImageView: UIImageView = UIImageView()
planetImageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100, height: 100))
planetImageView.backgroundColor = .red
planetImageView.addGestureRecognizer(panGesture)
planetImageView.isUserInteractionEnabled = true
self.addSubview(planetImageView)
}
}
关于ios - 使用 UIPanGestureRecognizer 拖动时 UIView 不会移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51912873/
UIGestureRecognizer 的文档引用重置函数。 但是,在 UIPanGestureRecognizer(UIGestureRecognizer 的子级)上调用 reset() 会生成此错
我有一个 UIPanGestureRecognizer,它根据我的喜好检测了太多次。我需要一个计数器并计算 3 个已完成的手势。每次我用手指平移识别器位置时,它都会触发 3 到 4 次。甚至触发了5个
我正在使用 UIPanGestureRecogniser实现拖放。当拖动开始时,我需要识别被拖动的对象。但是对象相对较小。如果用户没有在对象的中心点击对象,它就不会被拖动。 问题是当手势处理程序第一次
我正在尝试使用UIPanGestureRecognizer实现页面翻转动画。这是代码: - (void)handlePan:(UIPanGestureRecognizer *)recognizer {
我有一个 UIView 子类,我在其中添加了一个 UIPanGestureRocognizer: _panGestureRecognizer = [[UIPanGestureRecognizer al
我试图使用 UIPanGestureRecognizer 来移动我的对象,但我似乎无法让它顺利移动。当我朝一个特定的方向移动并转向相反的方向时,它不会立即使用react。我认为该值可能有问题,因为它在
我正在尝试实现 View 的拖动,当拖动停止时, View 滑到顶部并消失。我可以使用 UIPanGestureRecognizer 很好地拖动 View 。但在那之后,我用动画让它滑出。问题是在拖动
我在touchesEnded方法中调用了一个名为addProjectile的方法。 addProjectile接收touchesEnded方法接收的触摸的NSSet。为简单起见,我仅将相关代码发布到我
我遇到了 UIPanGestureRecognizer 的问题。假设我使用不同的标签动态添加 10 个按钮,当我添加第一个按钮时,尝试将其拖动到其他位置,然后它就可以正常工作。然后,如果我添加其他按钮
我有一个基类,它处理单元格的一些基本动画。在我的子类中,我已经覆盖了识别器目标并想做一些其他事情,但翻译始终是 0 因为我在基类中调用翻译被重置为 .zero . 有没有办法让我的基类执行基本动画并使
我正在使用 UIPanGestureRecognizer 将图像拖出 UICollectionViewCell,然后查看它是否与屏幕上其他位置的另一个图像发生碰撞。为此,我需要能够匹配他们的翻译坐标。
我创建了一个UIPanGestureRecognizer,但问题是当我将 View 向右滑动时, View 会向左移动。 当我向左滑动 View 时,它会向右滑动。为什么? let panGestur
我正在开发一个类似于 Tinder 中的卡片 View 。当卡片X原点大于我声明的值时,它会移出屏幕。否则,它会再次粘在中心。我正在 UIPanGestureRecognizer 函数中执行所有这些操
我有一个 UIPanGestureRecognizer 附加到父 View ,带有各种 CCSprite 我想在平移时在父 View 中移动。使用 [gesture locationOfTouch:i
使用 UIPanGestureRecognizer 我们正在移动 UICollectionView 中的单元格 当我们开始拖动时 UIGestureRecognizerStateBegan 被调用。但
我有 6 个 UIImageView,每个都连接到 UIPanGestureRecognizer,它们都连接到相同的方法。方法是: - (IBAction)handlePan:(UIPanGestur
我是 swift 和 xcode 的新手。使用 xcode 10 并尝试制作一个类似应用程序的嗡嗡声,我需要在 View 中移动多个图像。我发现了很多关于 UIPanGestureRecognizer
我有一个侧面板,其中有一个 UIImageView,我在其中附加了一个 UIPanGestureRecognizer,以便您可以推/拉侧边栏。效果很好。 问题是我有一些按钮有时会出现在侧边栏下方。如果
本质上,我想做的是移动 View 以跟随用户的平移。只要使用相同的平移对象,这种方法就可以正常工作。当用户释放并启动另一个平移时,问题就出现了。 根据文档,translationInView 中的值是
我正在将 UIPanGestureRecognizer 添加到我的 View Controller 中的一个自定义 View 。 我还使用 MFSideMenu 作为滑动菜单,在其框架中将 UIPan
我是一名优秀的程序员,十分优秀!