我认为采用一个小的Obj-C库并将其转换为
Swift是一个很好的学习实验.由于我最终想在应用程序中使用此库,因此我在此处找到了Path app菜单示例:
https://github.com/yourabi/PathMenuExample
我认为我已经做好了转换和搜索答案的工作,因为我刚刚开始使用Obj-C和Swift.但现在我遇到了一个我无法找到解决方案的错误.
ExpandableNavigation.swift
- import Foundation
- import UIKit;
- class ExpandableNavigation: NSObject {
- var mainButton: UIButton;
- var menuItems: NSArray;
- var radius: CGFloat;
- var speed: CGFloat;
- var bounce: CGFloat;
- var bounceSpeed: CGFloat;
- var expanded: Bool;
- var transition: Bool;
- init(menuItems: NSArray,mainButton: UIButton,radius: CGFloat) {
- self.menuItems = menuItems;
- self.mainButton = mainButton;
- self.radius = radius;
- self.speed = 0.15;
- self.bounce = 0.225;
- self.bounceSpeed = 0.1;
- expanded = false;
- transition = false;
- super.init()
- if self.mainButton != nil {
- for view: UIView in self.menuItems {
- view.center = self.mainButton.center;
- }
- self.mainButton.addTarget(self,action:"press",forControlEvents: UIControlEvents.TouchUpInside);
- }
- }
- func expand() -> Void {
- transition = true;
- UIView.animateWithDuration(0.15,animations: {
- self.mainButton.transform = CGAffineTransformMakeRotation(45.0 * M_PI/180)
- })
- for view: UIView in self.menuItems {
- var index: Int? = findIndex(self.menuItems,valueToFind: view);
- var oneOverCount: Float;
- if self.menuItems.count <= 1 {
- oneOverCount = 1.0;
- } else {
- oneOverCount = (1.0 / Float(self.menuItems.count - 1));
- }
- var indexOverCount: CGFloat = CGFloat(index!) * CGFloat(oneOverCount);
- var rad: CGFloat = (1.0 - CGFloat(indexOverCount)) * 90.0 * CGFloat(M_PI) / 180.0;
- var rotation: CGAffineTransform = CGAffineTransformMakeRotation(rad);
- var x: CGFloat = (self.radius + self.bounce * self.radius) * rotation.a;
- var y: CGFloat = (self.radius + self.bounce * self.radius) * rotation.c;
- var center: CGPoint = CGPointMake(view.center.x + x,view.center.y + y);
- UIView.animateWithDuration(self.speed,delay: self.speed * indexOverCount,options: UIViewAnimationOptions.CurveEaseIn,animations: {
- view.center = center;
- },completion: {(finished: Bool) in
- UIView.animateWithDuration(self.bounceSpeed,animations: {
- var x: CGFloat = self.bounce * self.radius * rotation.a;
- var y: CGFloat = self.bounce * self.radius * rotation.c;
- var center: CGPoint = CGPointMake(view.center.x + x,view.center.y + y);
- view.center = center;
- });
- if view == (self.menuItems.endIndex - 1) {
- self.expanded = true;
- self.transition = false;
- }
- })
- }
- }
- func collapse() -> Void {
- transition = true;
- }
- @IBAction func press(sender: AnyObject) {
- if !self.transition {
- if !self.expanded {
- self.expand();
- } else {
- self.collapse();
- }
- }
- }
- func findIndex<T: Equatable>(array: T[],valueToFind: T) -> Int? {
- for (index,value) in enumerate(array) {
- if value == valueToFind {
- return index
- }
- }
- return nil
- }
- }
ExpandableNavigation.swift出错
错误:类型注释与上下文类型“AnyObject”不匹配
在init()和expand()方法中都会出现此错误
for view:UIView in self.menuItems {
我尝试制作数组UIView [],但这导致其他错误.
ViewController.swift – 供参考
- class ViewController: UIViewController {
- @IBOutlet var expandNavMainButton: UIButton;
- @IBOutlet var expandNavCheckInButton: UIButton;
- @IBOutlet var expandNavReviewButton: UIButton;
- @IBOutlet var expandNavPhotoButton: UIButton;
- @IBOutlet var expandNavStatusButton: UIButton;
- var expandableNavigation: ExpandableNavigation;
- init(coder aDecoder: NSCoder!) {
- var buttons: NSArray = [expandNavCheckInButton,expandNavReviewButton,expandNavPhotoButton,expandNavStatusButton];
- var myRadius: CGFloat = 120.0
- self.expandableNavigation = ExpandableNavigation(menuItems: buttons,mainButton: self.expandNavMainButton,radius: myRadius);
- super.init(coder: aDecoder)
- }
为了安全起见,Swift不会为你进行任何隐式的施法.它不会在没有显式强制转换的情况下将AnyObject(NSArray存储的类型)强制转换为UIView.您应该执行以下操作:
- for obj : AnyObject in menuItems {
- if let view = obj as? UIView {
- view.center = self.mainButton.center;
- }
- }
这将使用AnyObject循环遍历菜单项数组,并在将obj作为一个视图投射之前检查obj是否为视图.