2015-12-22 97 views
0

我想要在selected shape的每個角落都有一個角落UIView,位於每個邊緣的中間位置,並且位於中心位置。只有一個顯示UIView子視圖?

selected shape有一個UITapGestureRecognizer連接到它,但是當我點擊選擇的形狀只有最後一個角落放置,the bottom right corner bRCorner, is what shows up

class DrawViewController: UIViewController { 
    var selectedShape: UIView? 
    var tLCorner: UIView? 
    var tMCorner: UIView? 
    var tRCorner: UIView? 
    var mLCorner: UIView? 
    var mMCorner: UIView? 
    var mRCorner: UIView? 
    var bLCorner: UIView? 
    var bMCorner: UIView? 
    var bRCorner: UIView? 

func tapShape(sender: UITapGestureRecognizer){ 
    selectedShape = sender.view! 

    //for each corner: set color, add pan feature, place in view 
    var corners = [UIView](count: 9, repeatedValue: UIView(frame: CGRectMake(0, 0, 10, 10))) 
    for corner in corners{ 
     corner.backgroundColor = fontColor 
     let pan = UIPanGestureRecognizer(target: self, action: "moveShape:") 
     corner.addGestureRecognizer(pan) 
     self.view.insertSubview(corner, aboveSubview: selectedShape!) 
    } 

    //place each corner in proper place 
    tLCorner = corners[0] 
    tLCorner!.center.x = (selectedShape?.frame.minX)! 
    tLCorner!.center.y = (selectedShape?.frame.minY)! 

    tMCorner = corners[1] 
    tMCorner!.center.x = (selectedShape?.frame.midX)! 
    tMCorner!.center.y = (selectedShape?.frame.minY)! 

    tRCorner = corners[2] 
    tRCorner!.center.x = (selectedShape?.frame.maxX)! 
    tRCorner!.center.y = (selectedShape?.frame.minY)! 

    mLCorner = corners[3] 
    mLCorner!.center.x = (selectedShape?.frame.minX)! 
    mLCorner!.center.y = (selectedShape?.frame.midY)! 

    mMCorner = corners[4] 
    mMCorner!.center = (selectedShape?.center)! 

    mRCorner = corners[5] 
    mRCorner!.center.x = (selectedShape?.frame.maxX)! 
    mRCorner!.center.y = (selectedShape?.frame.midY)! 

    bLCorner = corners[6] 
    bLCorner!.center.x = (selectedShape?.frame.minX)! 
    bLCorner!.center.y = (selectedShape?.frame.maxY)! 

    bMCorner = corners[7] 
    bMCorner!.center.x = (selectedShape?.frame.midX)! 
    bMCorner!.center.y = (selectedShape?.frame.maxY)! 

    bRCorner = corners[8] //the only corner that shows up! 
    bRCorner!.center.x = (selectedShape?.frame.maxX)! 
    bRCorner!.center.y = (selectedShape?.frame.maxY)! 
} 

然而,當我註釋掉最後兩行:

//bRCorner!.center.x = (selectedShape?.frame.maxX)! 
//bRCorner!.center.y = (selectedShape?.frame.maxY)! 

最後一個彎道被放置成爲底部中間拐角bMCornerbMCorner is what shows up

bMCorner = corners[7] //this is what shows up! 
bMCorner!.center.x = (selectedShape?.frame.midX)! 
bMCorner!.center.y = (selectedShape?.frame.maxY)! 

我很困惑,爲什麼會發生這種情況。我寧願讓所有的角落都出現。任何幫助,將不勝感激!

回答

1
var corners = [UIView](count: 9, repeatedValue: UIView(frame: CGRectMake(0, 0, 10, 10))) 

即代碼創建尺寸9與UIView S的內部的陣列。但是這些觀點都是完全相同的客體。基本上,你只有一個UIView有9個引用。相反,移動創建的循環:

var corners = [UIView]() 
for var i in 1...9 { 
    let view = UIView(frame: CGRectMake(0, 0, 10, 10)) 
    corners.append(view) 
    // your customization 
} 

你可以很容易地看到,當你把下面的代碼背後的差異:一個打印您的代碼

<UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>> <UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>> <UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>> <UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>> <UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>> <UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>> <UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>> <UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>> <UIView: 0x7fbc2a417100; frame = (0 0; 10 10); layer = <CALayer: 0x7fbc2a419ce0>>


corners.forEach { print($0) }

=> 9倍確切相同內存位置/視圖。

對於我的代碼它打印

<UIView: 0x7f825b420e60; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b4210e0>> <UIView: 0x7f825b42a6c0; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b401a80>> <UIView: 0x7f825b612420; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b611180>> <UIView: 0x7f825b50b960; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b504070>> <UIView: 0x7f825b50a250; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b611f30>> <UIView: 0x7f825b511e30; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b50b3e0>> <UIView: 0x7f825b725110; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b725280>> <UIView: 0x7f825b613850; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b613500>> <UIView: 0x7f825b727000; frame = (0 0; 10 10); layer = <CALayer: 0x7f825b724630>>

=> 9個不同視圖。

蘋果文檔說

Swift的陣列型也提供了與創建特定大小的陣列都設置爲相同的默認值其值的初始值設定。你通過這個初始化將被添加到新陣列(稱爲數)的項目數和適當的類型(稱爲repeatedValue)的默認值:

中的加粗部分是這裏您的具體問題。

+0

非常感謝! – 14wml

+0

@ 15ongm歡迎您。我總是瀏覽低信譽用戶的個人資料,並查看他們的問題,答案和upvotes。看起來你沒有做出任何(或沒有太多)使用你的特權來提供有用的答案。接受是爲了解決你的問題而打上標記,提高是爲了幫助作者給予幫助。另外在一個問題上你自己回答 - 你也可以在那裏接受你自己的答案。 – luk2302

+0

我明白了;我新來堆棧溢出,所以我不熟悉不同的功能。但是謝謝你讓我知道。我將確保使用upvote和標記功能。 – 14wml

相關問題