2015-12-22 2 views
0

Я хочу иметь один угол UIView на каждом углу selected shape, посредине каждого края и одного в центре.Появляется только один из подвью 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)! 

Последнего углом для размещения становится нижним средним углом bMCorner и bMCorner 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 с внутри. Но эти взгляды являются одним и тем же объектом. У вас есть только один 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 
} 

Вы можете легко увидеть разницу, когда вы кладете следующий код позади него:
corners.forEach { print($0) }

Это печатает для кода

<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>>

=> 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 различных видов.

яблоко документы говорят

Свифт типа массив также обеспечивает инициализатор для создания массива определенного размера с всех значений, установленных в то же значение по умолчанию. Вы передаете этому инициализатору количество элементов, которые будут добавлены в новый массив (называемый счетчиком), и значение по умолчанию соответствующего типа (так называемое repeatValue):

Жирная часть - ваша проблема.

+0

спасибо! – 14wml

+0

@ 15ongm добро пожаловать. Я всегда просматриваю профили пользователей с низкой репутацией и смотрю на их вопросы, ответы и опросы. Кажется, что вы не использовали (или не очень) использование своих привилегий для поддержки ответов, которые были полезны.Принятие заключается в том, чтобы пометить вопрос, как решить вашу проблему, авансирование - дать автору кредит за помощь. Кроме того, по одному вопросу вы сами ответили - вы также можете принять свой собственный ответ. – luk2302

+0

Я вижу; Я новичок в переполнении стека, поэтому я не знаком с различными функциями. Но спасибо, что сообщили мне. Я обязательно позабочусь о преимуществах надписи и маркировки. – 14wml

Смежные вопросы