2014-09-14 1 views
0

Я хочу создать идеально закругленный прямоугольник (круг) и нарисовать его на экране. Я проверил свой код на детской площадке, и он успешно рисует UIBezierPath. Тем не менее, он не красиво рисует его в симуляторе iOS. Вот код, я работал на:Несоблюдение() UIBezierPath

class Circles { 

     //Defining the rounded rect (Circle) 
     func roundRect(radius: CGFloat, angle: CGFloat) -> UIBezierPath { 

      //Creating the rounded the rectangle (Circle) 
      var roundedRect = UIBezierPath() 
      roundedRect.addArcWithCenter(CGPointZero, radius: radius, 
       startAngle: 0, endAngle: angle , 
       clockwise: true) 

      return roundedRect 
     } 


     //Drawing the Bezier Path (Circle) 
     func drawRect(rect: UIBezierPath){ 

      rect.moveToPoint(self.point) 
      UIColor.blackColor().setStroke() 
      rect.stroke() 
     } 

     //Giving the rounded rect (Circle) it's position 
     var point = CGPointMake(500, 500) 
    } 
    //Giving the rounded rect (Circle) it's size 
    var newRect = Circles().roundRect(200.0, angle: 7) 

    //Drawing the rounded rect (Circle) 
    Circles().drawRect(newRect) 

Я видел некоторые другие посты с подобными проблемами от несколько лет назад, однако они были в Objective-C, я пытался переводить, но не было никакой пользы , Я также попробовал несколько других способов рисования пути на экране, но, к сожалению, это бесполезно. Я тестировал его, чтобы убедиться, что функции работают с операторами println, проблема в том, что я не знаю, почему такт не активируется. Спасибо за чтение, -Зач.

Вот обновленная версия, используя то, что Майк сказал:

class CircleView: UIView { 
override func drawRect(rect: CGRect) { 

    // Creating the rectangle's size 
    var newRect = Circles().roundRect(200.0, angle: 7) 

    //Drawing the rectangle 
    Circles().drawRect(newRect) 
} 


//Holding all to do with the circle 
class Circles { 

    //Defining the rounded rect (Circle) 
    func roundRect(radius: CGFloat, angle: CGFloat) -> UIBezierPath { 

     //Creating the rounded rect (Circle) 
     var roundedRect = UIBezierPath() 
     roundedRect.addArcWithCenter(CGPointZero, radius: radius, 
      startAngle: 0, endAngle: angle , 
      clockwise: true) 

     return roundedRect 
    } 


    //Drawing the Bezier Path (Circle) 
    func drawRect(rect: UIBezierPath){ 

     rect.moveToPoint(self.point) 
     UIColor.blackColor().setStroke() 
     UIColor.blackColor().setFill() 
     rect.stroke() 
     rect.fill() 
    } 

    //Giving the rounded rect (Circle) it's position 
    var point = CGPointMake(500, 500) 
    } 

} 



class ViewController: UIViewController { 



override func viewDidLoad() { 
super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    //Generating the background 
    self.view.backgroundColor = UIColor(patternImage: UIImage(named: "normalpaper.jpg")) 

    let circleView = CircleView(frame: self.view.bounds) 
    self.view.addSubview(circleView) 

} 
+0

Это работает для меня в симуляторе с Xcode6 GM. Как вы называете 'Circles.drawRect (...)' когда вы тестируете его в симуляторе? –

+0

Что вы имеете в виду, как вы называете 'Circles.drawRect (...)'? Я называю это «Круги(). DrawRect (newRect)» внизу в примере кода. Я также использую 6.1 beta not 6 GM @Mike S – Althonos

+0

Извините, мне кажется, я должен был сказать: ** Где ** вы вызываете 'Circles.drawRect', когда вы тестируете этот код в симуляторе? Возможно, в пользовательской функции 'drawRect' UIView? –

ответ

1

Как упоминалось в комментариях, что вы звоните drawRect из viewDidLoad функции UIViewController «s. У вас нет действительного контекста рисования, так что это не сработает.

Самый простой способ сделать эту работу, чтобы создать подкласс UIView со своей собственной drawRect функции, которая вызывает Circle().drawRect(...) и добавить, что, как подвид ваших UIViewController «ы view.

Вот пример этого:

Примечание: Я сделал пользовательский вид прозрачный, установив circleView.opaque = false так, что фон вы упоминали в комментариях сквозит.

class CircleView: UIView { 
    override func drawRect(rect: CGRect) { 
     // I just copied this directly from the original question 
     var newRect = Circles().roundRect(200.0, angle: 7) 
     Circles().drawRect(newRect) 
    } 
} 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Create a new CircleView that's the same size of this 
     // view controller's bounds and add it to the view hierarchy 
     let circleView = CircleView(frame: self.view.bounds) 
     circleView.opaque = false 
     self.view.addSubview(circleView) 
    } 
} 

Примечание: Если вы собираетесь делать собственный рисунок, я настоятельно рекомендую вам прочитать Drawing and Printing Guide for iOS. Он научит вас всем основам, необходимым для его работы.

+0

Я скоро прочитаю это руководство, я обновил свое исходное сообщение до текущего кода, который у меня есть, создав пользовательский класс UIView. Однако выход, все тот же. Насколько я могу судить, он не печатает прямоугольник. Мне кажется, что 'Circles(). DrawRect (newRect)' в 'func drawRect' никогда не вызывается. (Протестировано с помощью инструкции 'println()') Как бы установить его так, чтобы он всегда назывался похожим на то, как всегда называется 'viewDidLoad'? – Althonos

+0

Я ничего не вижу в вашей функции 'viewDidLoad' в коде, добавленном к вопросу ... –

+0

Извините, случайно отключите его, исправив его сейчас: Кроме того, когда я добавляю добавленную вами вещь в viewDidLoad, мой фон не загружается. Я использую пользовательский фоновый рисунок изображения, поэтому я поцарапал белый фон, который вы добавили. – Althonos

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

  • Нет связанных вопросов^_^